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