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