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