1 /*
2 * Copyright (c) 2021-2023 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 "common.h"
17
18 namespace OHOS::Camera {
19 CameraManager::ResultCallback CameraManager::resultCallback_ = 0;
20
GetCurrentLocalTimeStamp()21 uint64_t CameraManager::GetCurrentLocalTimeStamp()
22 {
23 std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp =
24 std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
25 auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
26 return static_cast<uint64_t>(tmp.count());
27 }
28
DumpImageFile(int streamId,std::string suffix,const void * buffer,int32_t size)29 int32_t CameraManager::DumpImageFile(int streamId, std::string suffix, const void* buffer, int32_t size)
30 {
31 if (imageDataSaveSwitch == SWITCH_OFF) {
32 return 0;
33 }
34 if (streamId < 0) {
35 CAMERA_LOGE("ivalid stream id: %{public}d", streamId);
36 return -1;
37 }
38 char mkdirCmd[PATH_MAX] = {0};
39 char path[PATH_MAX] = {0};
40 int ret = sprintf_s(mkdirCmd, sizeof(mkdirCmd) / sizeof(mkdirCmd[0]),
41 "mkdir -p /data/stream-%d", streamId);
42 if (ret < 0) {
43 return -1;
44 }
45 system(mkdirCmd);
46 ret = sprintf_s(path, sizeof(path) / sizeof(path[0]), "/data/stream-%d/%lld.%s",
47 streamId, GetCurrentLocalTimeStamp(), suffix.c_str());
48 if (ret < 0) {
49 return -1;
50 }
51
52 int imgFd = open(path, O_RDWR | O_CREAT, 00766);
53 if (imgFd == -1) {
54 CAMERA_LOGE("open file failed, errno: %{public}s", strerror(errno));
55 return -1;
56 }
57
58 ret = write(imgFd, buffer, size);
59 if (ret == -1) {
60 CAMERA_LOGE("write file failed, error: %{public}s", strerror(errno));
61 close(imgFd);
62 return -1;
63 }
64 close(imgFd);
65 return 0;
66 }
Init()67 void CameraManager::Init()
68 {
69 uint32_t mainVer;
70 uint32_t minVer;
71 int32_t ret;
72 if (serviceV1_1 == nullptr) {
73 serviceV1_1 = OHOS::HDI::Camera::V1_1::ICameraHost::Get("camera_service", false);
74 if (serviceV1_1 == nullptr) {
75 CAMERA_LOGE("V1_1::IcameraHost get failed");
76 return;
77 } else {
78 CAMERA_LOGI("ICameraHost get success");
79 ret = serviceV1_1->GetVersion(mainVer, minVer);
80 if (ret != 0) {
81 CAMERA_LOGE("V1_1::ICameraHost get version failed, ret = %{public}d", ret);
82 } else {
83 CAMERA_LOGE("V1_1::ICameraHost get version success, %{public}d, %{public}d", mainVer, minVer);
84 }
85 }
86
87 service = static_cast<OHOS::HDI::Camera::V1_0::ICameraHost *>(serviceV1_1.GetRefPtr());
88 }
89
90 hostCallback = new TestCameraHostCallback();
91 service->SetCallback(hostCallback);
92 }
93
InitV1_2()94 void CameraManager::InitV1_2()
95 {
96 uint32_t mainVer;
97 uint32_t minVer;
98 int32_t ret;
99 if (serviceV1_2 == nullptr) {
100 serviceV1_2 = OHOS::HDI::Camera::V1_2::ICameraHost::Get("camera_service", false);
101 if (serviceV1_2 == nullptr) {
102 CAMERA_LOGE("V1_2::IcameraHost get failed");
103 return;
104 } else {
105 CAMERA_LOGI("ICameraHost get success");
106 ret = serviceV1_2->GetVersion(mainVer, minVer);
107 if (ret != 0) {
108 CAMERA_LOGE("V1_2::ICameraHost get version failed, ret = %{public}d", ret);
109 } else {
110 CAMERA_LOGE("V1_2::ICameraHost get version success, %{public}d, %{public}d", mainVer, minVer);
111 }
112 }
113
114 service = static_cast<OHOS::HDI::Camera::V1_0::ICameraHost *>(serviceV1_2.GetRefPtr());
115 }
116
117 hostCallback = new TestCameraHostCallback();
118 service->SetCallback(hostCallback);
119 }
120
InitV1_3()121 void CameraManager::InitV1_3()
122 {
123 uint32_t mainVer;
124 uint32_t minVer;
125 int32_t ret;
126 if (serviceV1_3 == nullptr) {
127 serviceV1_3 = OHOS::HDI::Camera::V1_3::ICameraHost::Get("camera_service", false);
128 if (serviceV1_3 == nullptr) {
129 CAMERA_LOGE("V1_3::IcameraHost get failed");
130 return;
131 } else {
132 CAMERA_LOGI("ICameraHost get success");
133 ret = serviceV1_3->GetVersion(mainVer, minVer);
134 if (ret != 0) {
135 CAMERA_LOGE("V1_3::ICameraHost get version failed, ret = %{public}d", ret);
136 return;
137 } else {
138 CAMERA_LOGE("V1_3::ICameraHost get version success, %{public}d, %{public}d", mainVer, minVer);
139 }
140 }
141
142 service = static_cast<OHOS::HDI::Camera::V1_0::ICameraHost *>(serviceV1_3.GetRefPtr());
143 serviceV1_1 = static_cast<OHOS::HDI::Camera::V1_1::ICameraHost *>(serviceV1_3.GetRefPtr());
144 serviceV1_2 = static_cast<OHOS::HDI::Camera::V1_2::ICameraHost *>(serviceV1_3.GetRefPtr());
145 }
146 hostCallback = new TestCameraHostCallback();
147 serviceV1_3->SetCallback(hostCallback);
148 }
149
OpenV1_2()150 void CameraManager::OpenV1_2()
151 {
152 if (cameraDevice == nullptr) {
153 service->GetCameraIds(cameraIds);
154 if (cameraIds.size() == 0) {
155 CAMERA_LOGE("camera device list empty");
156 }
157 GetCameraMetadata();
158 deviceCallback = new OHOS::Camera::CameraManager::DemoCameraDeviceCallback();
159
160 rc = serviceV1_2->OpenCamera_V1_1(cameraIds.front(), deviceCallback, cameraDeviceV1_1);
161 if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_1 == nullptr) {
162 CAMERA_LOGE("openCamera V1_1 failed, rc = %{public}d", rc);
163 return;
164 }
165
166 cameraDevice = static_cast<OHOS::HDI::Camera::V1_0::ICameraDevice *>(cameraDeviceV1_1.GetRefPtr());
167 CAMERA_LOGI("OpenCamera V1_2 success");
168 }
169 }
170
OpenV1_3()171 void CameraManager::OpenV1_3()
172 {
173 if (cameraDevice == nullptr) {
174 serviceV1_3->GetCameraIds(cameraIds);
175 if (cameraIds.size() == 0) {
176 CAMERA_LOGE("camera device list empty");
177 }
178 GetCameraMetadata();
179 deviceCallback = new OHOS::Camera::CameraManager::DemoCameraDeviceCallback();
180
181 rc = serviceV1_3->OpenCamera_V1_3(cameraIds.front(), deviceCallback, cameraDeviceV1_3);
182 if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_3 == nullptr) {
183 CAMERA_LOGE("openCamera V1_1 failed, rc = %{public}d", rc);
184 return;
185 }
186
187 cameraDevice = static_cast<OHOS::HDI::Camera::V1_0::ICameraDevice *>(cameraDeviceV1_3.GetRefPtr());
188 cameraDeviceV1_1 = static_cast<OHOS::HDI::Camera::V1_1::ICameraDevice *>(cameraDeviceV1_3.GetRefPtr());
189 cameraDeviceV1_2 = static_cast<OHOS::HDI::Camera::V1_2::ICameraDevice *>(cameraDeviceV1_3.GetRefPtr());
190 CAMERA_LOGI("OpenCamera V1_2 success");
191 }
192 }
193
OpenCameraV1_2()194 void CameraManager::OpenCameraV1_2()
195 {
196 if (cameraDevice == nullptr) {
197 service->GetCameraIds(cameraIds);
198 if (cameraIds.size() == 0) {
199 CAMERA_LOGE("camera device list empty");
200 }
201 GetCameraMetadata();
202 deviceCallback = new OHOS::Camera::CameraManager::DemoCameraDeviceCallback();
203
204 rc = serviceV1_2->OpenCamera_V1_2(cameraIds.front(), deviceCallback, cameraDeviceV1_2);
205 if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_2 == nullptr) {
206 CAMERA_LOGE("openCamera V1_1 failed, rc = %{public}d", rc);
207 return;
208 }
209
210 cameraDevice = static_cast<OHOS::HDI::Camera::V1_0::ICameraDevice *>(cameraDeviceV1_2.GetRefPtr());
211 CAMERA_LOGI("OpenCamera V1_2 success");
212 }
213 }
214
Open()215 void CameraManager::Open()
216 {
217 if (cameraDevice == nullptr) {
218 service->GetCameraIds(cameraIds);
219 if (cameraIds.size() == 0) {
220 CAMERA_LOGE("camera device list empty");
221 }
222 GetCameraMetadata();
223 deviceCallback = new OHOS::Camera::CameraManager::DemoCameraDeviceCallback();
224
225 rc = serviceV1_1->OpenCamera_V1_1(cameraIds.front(), deviceCallback, cameraDeviceV1_1);
226 if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_1 == nullptr) {
227 CAMERA_LOGE("openCamera V1_1 failed, rc = %{public}d", rc);
228 return;
229 }
230
231 cameraDevice = static_cast<OHOS::HDI::Camera::V1_0::ICameraDevice *>(cameraDeviceV1_1.GetRefPtr());
232 CAMERA_LOGI("OpenCamera V1_1 success");
233 }
234 }
235
GetCameraMetadata()236 void CameraManager::GetCameraMetadata()
237 {
238 rc = service->GetCameraAbility(cameraIds.front(), abilityVec);
239 if (rc != HDI::Camera::V1_0::NO_ERROR) {
240 CAMERA_LOGE("GetCameraAbility failed, rc = %{public}d", rc);
241 }
242 MetadataUtils::ConvertVecToMetadata(abilityVec, ability);
243
244 common_metadata_header_t* data = ability->get();
245 camera_metadata_item_t entry;
246 int ret = FindCameraMetadataItem(data, OHOS_CONTROL_AE_AVAILABLE_MODES, &entry);
247 if (ret == 0) {
248 CAMERA_LOGI("get OHOS_CONTROL_AE_AVAILABLE_MODES success");
249 }
250 }
251
Close()252 void CameraManager::Close()
253 {
254 if (cameraDevice != nullptr) {
255 cameraDevice->Close();
256 cameraDevice = nullptr;
257 }
258 }
259
DefaultPreview(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)260 void CameraManager::DefaultPreview(
261 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
262 {
263 infos->v1_0.streamId_ = streamIdPreview;
264 infos->v1_0.width_ = previewWidth;
265 infos->v1_0.height_ = previewHeight;
266 infos->v1_0.format_ = previewFormat;
267 infos->v1_0.dataspace_ = UT_DATA_SIZE;
268 infos->v1_0.intent_ = StreamIntent::PREVIEW;
269 infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
270 }
271
DefaultCapture(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)272 void CameraManager::DefaultCapture(
273 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
274 {
275 infos->v1_0.streamId_ = streamIdCapture;
276 infos->v1_0.width_ = captureWidth;
277 infos->v1_0.height_ = captureHeight;
278 infos->v1_0.format_ = snapshotFormat;
279 infos->v1_0.dataspace_ = UT_DATA_SIZE;
280 infos->v1_0.intent_ = StreamIntent::STILL_CAPTURE;
281 infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
282 }
283
DefaultSketch(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)284 void CameraManager::DefaultSketch(
285 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
286 {
287 infos->v1_0.streamId_ = streamIdSketch;
288 infos->v1_0.width_ = sketchWidth;
289 infos->v1_0.height_ = sketchHeight;
290 infos->v1_0.format_ = previewFormat;
291 infos->v1_0.dataspace_ = UT_DATA_SIZE;
292 infos->v1_0.intent_ = StreamIntent::PREVIEW;
293 infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
294 }
295
DefaultInfosSketch(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)296 void CameraManager::DefaultInfosSketch(
297 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
298 {
299 DefaultSketch(infos);
300 std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
301 infos->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
302 DumpImageFile(streamIdSketch, "yuv", addr, size);
303 });
304 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
305 consumerMap_[StreamIntent::PREVIEW] = consumer_pre;
306 }
307
DefaultInfosPreviewV1_2(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)308 void CameraManager::DefaultInfosPreviewV1_2(
309 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
310 {
311 DefaultPreview(infos);
312 std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
313 infos->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
314 DumpImageFile(streamIdPreview, "yuv", addr, size);
315 });
316 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
317 }
318
DefaultInfosPreview(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)319 void CameraManager::DefaultInfosPreview(
320 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
321 {
322 DefaultPreview(infos);
323 std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
324 infos->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
325 DumpImageFile(streamIdPreview, "yuv", addr, size);
326 });
327 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
328 consumerMap_[StreamIntent::PREVIEW] = consumer_pre;
329 }
330
DefaultInfosCapture(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)331 void CameraManager::DefaultInfosCapture(
332 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
333 {
334 DefaultCapture(infos);
335 std::shared_ptr<StreamConsumer> consumer_capture = std::make_shared<StreamConsumer>();
336 infos->v1_0.bufferQueue_ = consumer_capture->CreateProducerSeq([this](void* addr, uint32_t size) {
337 DumpImageFile(streamIdCapture, "jpeg", addr, size);
338 });
339 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
340 consumerMap_[StreamIntent::STILL_CAPTURE] = consumer_capture;
341 }
342
DefaultInfosVideo(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)343 void CameraManager::DefaultInfosVideo(
344 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
345 {
346 infos->v1_0.streamId_ = streamIdVideo;
347 infos->v1_0.width_ = videoWidth;
348 infos->v1_0.height_ = videoHeight;
349 infos->v1_0.format_ = videoFormat;
350 infos->v1_0.dataspace_ = UT_DATA_SIZE;
351 infos->v1_0.intent_ = StreamIntent::VIDEO;
352 infos->v1_0.encodeType_ = ENCODE_TYPE_H265;
353 infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
354 std::shared_ptr<StreamConsumer> consumer_video = std::make_shared<StreamConsumer>();
355 infos->v1_0.bufferQueue_ = consumer_video->CreateProducerSeq([this](void* addr, uint32_t size) {
356 DumpImageFile(streamIdVideo, "yuv", addr, size);
357 });
358 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
359 consumerMap_[StreamIntent::VIDEO] = consumer_video;
360 }
361
DefaultInfosAnalyze(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)362 void CameraManager::DefaultInfosAnalyze(
363 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
364 {
365 infos->v1_0.streamId_ = streamIdAnalyze;
366 infos->v1_0.width_ = analyzeWidth;
367 infos->v1_0.height_ = analyzeHeight;
368 infos->v1_0.format_ = analyzeFormat;
369 infos->v1_0.dataspace_ = UT_DATA_SIZE;
370 infos->v1_0.intent_ = StreamIntent::ANALYZE;
371 infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
372
373 std::shared_ptr<StreamConsumer> consumer_analyze = std::make_shared<StreamConsumer>();
374 infos->v1_0.bufferQueue_ = consumer_analyze->CreateProducerSeq([this](void* addr, uint32_t size) {
375 common_metadata_header_t *data = static_cast<common_metadata_header_t *>(addr);
376 camera_metadata_item_t entry = {};
377
378 int ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_IDS, &entry);
379 if (ret == 0) {
380 for (size_t i = 0; i < entry.count; i++) {
381 int id = entry.data.i32[i];
382 CAMERA_LOGI("Face ids : %{public}d", id);
383 }
384 }
385
386 ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_RECTANGLES, &entry);
387 if (ret == 0) {
388 for (size_t i = 0; i < entry.count; i++) {
389 int id = entry.data.i32[i];
390 CAMERA_LOGI("Face rectangles : %{public}d", id);
391 }
392 }
393 });
394 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
395 consumerMap_[StreamIntent::ANALYZE] = consumer_analyze;
396 }
397
StartStream(std::vector<StreamIntent> intents)398 void CameraManager::StartStream(std::vector<StreamIntent> intents)
399 {
400 streamOperatorCallback = new TestStreamOperatorCallback();
401 uint32_t mainVersion = 1;
402 uint32_t minVersion = 0;
403 rc = cameraDeviceV1_1->GetStreamOperator_V1_1(streamOperatorCallback, streamOperator_V1_1);
404 if (rc == HDI::Camera::V1_0::NO_ERROR) {
405 rc = streamOperator_V1_1->GetVersion(mainVersion, minVersion);
406 streamOperator = static_cast<OHOS::HDI::Camera::V1_0::IStreamOperator *>(streamOperator_V1_1.GetRefPtr());
407 if (rc != HDI::Camera::V1_0::NO_ERROR) {
408 CAMERA_LOGE("StreamOperator V1_1 get version failed, rc = %{public}d", rc);
409 } else {
410 CAMERA_LOGI("StreamOperator V1_1 get version success, %{public}u, %{public}u",
411 mainVersion, minVersion);
412 }
413 CAMERA_LOGI("GetStreamOperator success");
414 } else {
415 CAMERA_LOGE("GetStreamOperator fail, rc = %{public}d", rc);
416 }
417 streamInfoPre = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
418 streamInfoVideo = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
419 streamInfoCapture = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
420 streamInfoAnalyze = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
421
422 for (auto& streamIntent : intents) {
423 if (streamIntent == StreamIntent::PREVIEW) {
424 DefaultInfosPreview(streamInfoPre);
425 streamInfos.push_back(*streamInfoPre);
426 } else if (streamIntent == StreamIntent::VIDEO) {
427 DefaultInfosVideo(streamInfoVideo);
428 streamInfos.push_back(*streamInfoVideo);
429 } else if (streamIntent == StreamIntent::ANALYZE) {
430 DefaultInfosAnalyze(streamInfoAnalyze);
431 streamInfos.push_back(*streamInfoAnalyze);
432 } else {
433 DefaultInfosCapture(streamInfoCapture);
434 streamInfos.push_back(*streamInfoCapture);
435 }
436 }
437
438 rc = streamOperator_V1_1->CreateStreams_V1_1(streamInfos);
439 rc = streamOperator_V1_1->CommitStreams(OperationMode::NORMAL, abilityVec);
440 sleep(1);
441 std::vector<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>().swap(streamInfos);
442 }
443
StartCapture(int streamId,int captureId,bool shutterCallback,bool isStreaming)444 void CameraManager::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)
445 {
446 captureInfo = std::make_shared<CaptureInfo>();
447 captureInfo->streamIds_ = {streamId};
448 captureInfo->captureSetting_ = abilityVec;
449 captureInfo->enableShutterCallback_ = shutterCallback;
450 if (streamOperator_V1_2 != nullptr) {
451 rc = (CamRetCode)streamOperator_V1_2->Capture(captureId, *captureInfo, isStreaming);
452 } else if (streamOperator_V1_1 != nullptr) {
453 rc = (CamRetCode)streamOperator_V1_1->Capture(captureId, *captureInfo, isStreaming);
454 } else {
455 rc = (CamRetCode)streamOperator->Capture(captureId, *captureInfo, isStreaming);
456 }
457
458 if (rc == HDI::Camera::V1_0::NO_ERROR) {
459 CAMERA_LOGI("check Capture: Capture success, %{public}d", captureId);
460 } else {
461 std::cout << "rc = " << rc << std::endl;
462 CAMERA_LOGE("check Capture: Capture fail, rc = %{public}d", rc);
463 }
464 sleep(UT_SLEEP_TIME);
465 }
466
CalculateFps(int64_t timestamp,int32_t streamId)467 void CameraManager::StreamConsumer::CalculateFps(int64_t timestamp, int32_t streamId)
468 {
469 if (isFirstCalculateFps_) {
470 if ((timestamp - intervalTimestamp_) >= interval_) {
471 int64_t timeInterval = timestamp - intervalTimestamp_;
472 if (timeInterval != 0) {
473 float fps = (int64_t)(100000000000 * timestampCount_ / timeInterval) / 100.0;
474 CAMERA_LOGI("Calculate FPS success, streamId: %{public}d, Fps:%{public}f", streamId, fps);
475 interval_ = ONESECOND_OF_MICROSECOND_UNIT;
476 } else {
477 CAMERA_LOGE("Calculate FPS error timeInerval is 0");
478 }
479 }
480 } else {
481 intervalTimestamp_ = timestamp;
482 isFirstCalculateFps_ = true;
483 }
484 if ((timestamp - intervalTimestamp_) >= ONESECOND_OF_MICROSECOND_UNIT * UT_SECOND_TIMES) {
485 intervalTimestamp_ = timestamp;
486 timestampCount_ = 0;
487 interval_ = ONESECOND_OF_MICROSECOND_UNIT;
488 }
489 timestampCount_++;
490 }
491
CreateProducerForBuffer(OHOS::sptr<OHOS::SurfaceBuffer> buffer,int64_t timestamp)492 void CameraManager::StreamConsumer::CreateProducerForBuffer(
493 OHOS::sptr<OHOS::SurfaceBuffer> buffer, int64_t timestamp)
494 {
495 if (buffer != nullptr) {
496 void* addr = buffer->GetVirAddr();
497 uint32_t size = buffer->GetSize();
498 int32_t gotSize = 0;
499 int32_t isKey = 0;
500 int32_t streamId = 0;
501 int32_t captureId = 0;
502 buffer->GetExtraData()->ExtraGet(OHOS::Camera::dataSize, gotSize);
503 buffer->GetExtraData()->ExtraGet(OHOS::Camera::isKeyFrame, isKey);
504 buffer->GetExtraData()->ExtraGet(OHOS::Camera::timeStamp, timestamp);
505 buffer->GetExtraData()->ExtraGet(OHOS::Camera::streamId, streamId);
506 buffer->GetExtraData()->ExtraGet(OHOS::Camera::captureId, captureId);
507 if (gotSize) {
508 CalculateFps(timestamp, streamId);
509 callback_(addr, gotSize);
510 } else {
511 callback_(addr, size);
512 }
513 consumer_->ReleaseBuffer(buffer, -1);
514 shotCount_--;
515 if (shotCount_ == 0) {
516 std::unique_lock<std::mutex> l(l_);
517 cv_.notify_one();
518 }
519 }
520 }
521
CreateProducer(std::function<void (void *,uint32_t)> callback)522 OHOS::sptr<OHOS::IBufferProducer> CameraManager::StreamConsumer::CreateProducer(
523 std::function<void(void*, uint32_t)> callback)
524 {
525 consumer_ = OHOS::IConsumerSurface::Create();
526 if (consumer_ == nullptr) {
527 return nullptr;
528 }
529 sptr<IBufferConsumerListener> listener = new TestBufferConsumerListener();
530 consumer_->RegisterConsumerListener(listener);
531 auto producer = consumer_->GetProducer();
532 if (producer == nullptr) {
533 return nullptr;
534 }
535
536 callback_ = callback;
537 consumerThread_ = new std::thread([this, listener] {
538 int32_t flushFence = 0;
539 int64_t timestamp = 0;
540 OHOS::Rect damage;
541 TestBufferConsumerListener* checker = static_cast<TestBufferConsumerListener*>(listener.GetRefPtr());
542 while (running_ == true) {
543 OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr;
544 if (checker->checkBufferAvailable()) {
545 consumer_->AcquireBuffer(buffer, flushFence, timestamp, damage);
546 CreateProducerForBuffer(buffer, timestamp);
547 }
548 if (running_ == false) {
549 break;
550 }
551 usleep(1);
552 }
553 });
554
555 return producer;
556 }
557
CreateProducerSeq(std::function<void (void *,uint32_t)> callback)558 OHOS::sptr<BufferProducerSequenceable> CameraManager::StreamConsumer::CreateProducerSeq(
559 std::function<void(void*, uint32_t)> callback)
560 {
561 OHOS::sptr<OHOS::IBufferProducer> producer = CreateProducer(callback);
562 if (producer == nullptr) {
563 return nullptr;
564 }
565
566 return new BufferProducerSequenceable(producer);
567 }
568
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamId)569 int32_t CameraManager::TestStreamOperatorCallback::OnCaptureStarted(int32_t captureId,
570 const std::vector<int32_t> &streamId)
571 {
572 for (auto it : streamId) {
573 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
574 }
575 return HDI::Camera::V1_0::NO_ERROR;
576 }
577
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)578 int32_t CameraManager::TestStreamOperatorCallback::OnCaptureEnded(int32_t captureId,
579 const std::vector<CaptureEndedInfo> &infos)
580 {
581 for (auto it : infos) {
582 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_,
583 it.frameCount_);
584 }
585 return HDI::Camera::V1_0::NO_ERROR;
586 }
587
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)588 int32_t CameraManager::TestStreamOperatorCallback::OnCaptureError(int32_t captureId,
589 const std::vector<CaptureErrorInfo> &infos)
590 {
591 for (auto it : infos) {
592 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_,
593 it.error_);
594 }
595 return HDI::Camera::V1_0::NO_ERROR;
596 }
597
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)598 int32_t CameraManager::TestStreamOperatorCallback::OnFrameShutter(int32_t captureId,
599 const std::vector<int32_t> &streamIds, uint64_t timestamp)
600 {
601 (void)timestamp;
602 for (auto it : streamIds) {
603 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
604 }
605 return HDI::Camera::V1_0::NO_ERROR;
606 }
607
OnError(ErrorType type,int32_t errorMsg)608 int32_t CameraManager::DemoCameraDeviceCallback::OnError(ErrorType type, int32_t errorMsg)
609 {
610 CAMERA_LOGE("type: %{public}d, errorMsg: %{public}d", type, errorMsg);
611 return HDI::Camera::V1_0::NO_ERROR;
612 }
613
OnResult(uint64_t timestamp,const std::vector<uint8_t> & result)614 int32_t CameraManager::DemoCameraDeviceCallback::OnResult(uint64_t timestamp, const std::vector<uint8_t> &result)
615 {
616 if (CameraManager::resultCallback_) {
617 std::shared_ptr<CameraMetadata> resultMeta;
618 MetadataUtils::ConvertVecToMetadata(result, resultMeta);
619 CameraManager::resultCallback_(timestamp, resultMeta);
620 }
621 return HDI::Camera::V1_0::NO_ERROR;
622 }
623
OnCameraStatus(const std::string & cameraId,CameraStatus status)624 int32_t CameraManager::TestCameraHostCallback::OnCameraStatus(const std::string& cameraId, CameraStatus status)
625 {
626 CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
627 return HDI::Camera::V1_0::NO_ERROR;
628 }
629
OnFlashlightStatus(const std::string & cameraId,FlashlightStatus status)630 int32_t CameraManager::TestCameraHostCallback::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status)
631 {
632 CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
633 return HDI::Camera::V1_0::NO_ERROR;
634 }
635
OnCameraEvent(const std::string & cameraId,CameraEvent event)636 int32_t CameraManager::TestCameraHostCallback::OnCameraEvent(const std::string& cameraId, CameraEvent event)
637 {
638 CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), event);
639 return HDI::Camera::V1_0::NO_ERROR;
640 }
641
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamId)642 int32_t CameraManager::TestStreamOperatorCallbackV1_2::OnCaptureStarted(
643 int32_t captureId, const std::vector<int32_t> &streamId)
644 {
645 for (auto it : streamId) {
646 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
647 }
648 return HDI::Camera::V1_0::NO_ERROR;
649 }
650
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)651 int32_t CameraManager::TestStreamOperatorCallbackV1_2::OnCaptureEnded(int32_t captureId,
652 const std::vector<CaptureEndedInfo> &infos)
653 {
654 for (auto it : infos) {
655 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_,
656 it.frameCount_);
657 }
658 return HDI::Camera::V1_0::NO_ERROR;
659 }
660
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)661 int32_t CameraManager::TestStreamOperatorCallbackV1_2::OnCaptureError(int32_t captureId,
662 const std::vector<CaptureErrorInfo> &infos)
663 {
664 for (auto it : infos) {
665 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_,
666 it.error_);
667 }
668 return HDI::Camera::V1_0::NO_ERROR;
669 }
670
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)671 int32_t CameraManager::TestStreamOperatorCallbackV1_2::OnFrameShutter(int32_t captureId,
672 const std::vector<int32_t> &streamIds, uint64_t timestamp)
673 {
674 (void)timestamp;
675 for (auto it : streamIds) {
676 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
677 }
678 return HDI::Camera::V1_0::NO_ERROR;
679 }
680
OnCaptureStarted_V1_2(int32_t captureId,const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> & infos)681 int32_t CameraManager::TestStreamOperatorCallbackV1_2::OnCaptureStarted_V1_2(int32_t captureId,
682 const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> &infos)
683 {
684 for (auto it : infos) {
685 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it.streamId_);
686 }
687 return HDI::Camera::V1_0::NO_ERROR;
688 }
689
690 }
691