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