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 
GetCameraMetadata(int cameraId)132 void Test::GetCameraMetadata(int cameraId)
133 {
134     if (DEVICE_1 == cameraId) {
135         rc = serviceV1_3->GetCameraAbility(cameraIds[1], abilityVec);
136     } else {
137         rc = serviceV1_3->GetCameraAbility(cameraIds[0], abilityVec);
138     }
139     if (rc != HDI::Camera::V1_0::NO_ERROR) {
140         CAMERA_LOGE("GetCameraAbility failed, rc = %{public}d", rc);
141     }
142     MetadataUtils::ConvertVecToMetadata(abilityVec, ability);
143     EXPECT_NE(ability, nullptr);
144 }
145 
Close()146 void Test::Close()
147 {
148     if (cameraDeviceV1_3 != nullptr) {
149         cameraDeviceV1_3->Close();
150         cameraDeviceV1_3 = nullptr;
151     }
152 }
153 
DefaultPreview(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)154 void Test::DefaultPreview(
155     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
156 {
157     infos->v1_0.streamId_ = streamIdPreview;
158     infos->v1_0.width_ = previewWidth;
159     infos->v1_0.height_ = previewHeight;
160     infos->v1_0.format_ = previewFormat;
161     infos->v1_0.dataspace_ = UT_DATA_SIZE;
162     infos->v1_0.intent_ = StreamIntent::PREVIEW;
163     infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
164 }
165 
DefaultCapture(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)166 void Test::DefaultCapture(
167     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
168 {
169     infos->v1_0.streamId_ = streamIdCapture;
170     infos->v1_0.width_ = captureWidth;
171     infos->v1_0.height_ = captureHeight;
172     infos->v1_0.format_ = snapshotFormat;
173     infos->v1_0.dataspace_ = UT_DATA_SIZE;
174     infos->v1_0.intent_ = StreamIntent::STILL_CAPTURE;
175     infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
176 }
177 
DefaultSketch(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)178 void Test::DefaultSketch(
179     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
180 {
181     infos->v1_0.streamId_ = streamIdSketch;
182     infos->v1_0.width_ = sketchWidth;
183     infos->v1_0.height_ = sketchHeight;
184     infos->v1_0.format_ = previewFormat;
185     infos->v1_0.dataspace_ = UT_DATA_SIZE;
186     infos->v1_0.intent_ = StreamIntent::PREVIEW;
187     infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
188 }
189 
DefaultMeta(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)190 void Test::DefaultMeta(
191     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
192 {
193     infos->v1_0.streamId_ = streamIdMeta;
194     infos->v1_0.width_ = metaWidth;
195     infos->v1_0.height_ = metaHeight;
196     infos->v1_0.format_ = previewFormat;
197     infos->v1_0.dataspace_ = UT_DATA_SIZE;
198     infos->v1_0.intent_ = StreamIntent::PREVIEW;
199     infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
200 }
201 
DefaultInfosSketch(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)202 void Test::DefaultInfosSketch(
203     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
204 {
205     DefaultSketch(infos);
206     std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
207     infos->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
208         DumpImageFile(streamIdSketch, "yuv", addr, size);
209     });
210     infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
211     consumerMap_[StreamIntent::PREVIEW] = consumer_pre;
212 }
213 
DefaultInfosMeta(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)214 void Test::DefaultInfosMeta(
215     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
216 {
217     DefaultMeta(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(streamIdMeta, "yuv", addr, size);
221     });
222     infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
223     consumerMap_[StreamIntent::PREVIEW] = consumer_pre;
224 }
225 
DefaultInfosPreviewV1_2(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)226 void Test::DefaultInfosPreviewV1_2(
227     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
228 {
229     DefaultPreview(infos);
230     std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
231     infos->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
232         DumpImageFile(streamIdPreview, "yuv", addr, size);
233     });
234     infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
235 }
236 
DefaultInfosPreview(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)237 void Test::DefaultInfosPreview(
238     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
239 {
240     DefaultPreview(infos);
241     std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
242     infos->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
243         DumpImageFile(streamIdPreview, "yuv", addr, size);
244     });
245     infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
246     consumerMap_[StreamIntent::PREVIEW] = consumer_pre;
247 }
248 
DefaultInfosCapture(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)249 void Test::DefaultInfosCapture(
250     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
251 {
252     DefaultCapture(infos);
253     std::shared_ptr<StreamConsumer> consumer_capture = std::make_shared<StreamConsumer>();
254     infos->v1_0.bufferQueue_ = consumer_capture->CreateProducerSeq([this](void* addr, uint32_t size) {
255         DumpImageFile(streamIdCapture, "jpeg", addr, size);
256     });
257     infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
258     consumerMap_[StreamIntent::STILL_CAPTURE] = consumer_capture;
259 }
260 
DefaultInfosProfessionalCapture(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)261 void Test::DefaultInfosProfessionalCapture(
262     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
263 {
264     DefaultCapture(infos);
265     std::shared_ptr<StreamConsumer> consumer_capture = std::make_shared<StreamConsumer>();
266     infos->v1_0.bufferQueue_ = consumer_capture->CreateProducerSeq([this](void* addr, uint32_t size) {
267         DumpImageFile(streamIdCapture, "yuv", addr, size);
268     });
269     infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
270     consumerMap_[StreamIntent::STILL_CAPTURE] = consumer_capture;
271 }
272 
DefaultInfosVideo(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)273 void Test::DefaultInfosVideo(
274     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
275 {
276     infos->v1_0.streamId_ = streamIdVideo;
277     infos->v1_0.width_ = videoWidth;
278     infos->v1_0.height_ = videoHeight;
279     infos->v1_0.format_ = videoFormat;
280     infos->v1_0.dataspace_ = UT_DATA_SIZE;
281     infos->v1_0.intent_ = StreamIntent::VIDEO;
282     infos->v1_0.encodeType_ = ENCODE_TYPE_H265;
283     infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
284     std::shared_ptr<StreamConsumer> consumer_video = std::make_shared<StreamConsumer>();
285     infos->v1_0.bufferQueue_ = consumer_video->CreateProducerSeq([this](void* addr, uint32_t size) {
286         DumpImageFile(streamIdVideo, "yuv", addr, size);
287     });
288     infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
289     consumerMap_[StreamIntent::VIDEO] = consumer_video;
290 }
291 
DefaultInfosAnalyze(std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> & infos)292 void Test::DefaultInfosAnalyze(
293     std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
294 {
295     infos->v1_0.streamId_ = streamIdAnalyze;
296     infos->v1_0.width_ = analyzeWidth;
297     infos->v1_0.height_ = analyzeHeight;
298     infos->v1_0.format_ = analyzeFormat;
299     infos->v1_0.dataspace_ = UT_DATA_SIZE;
300     infos->v1_0.intent_ = StreamIntent::ANALYZE;
301     infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
302 
303     std::shared_ptr<StreamConsumer> consumer_analyze = std::make_shared<StreamConsumer>();
304     infos->v1_0.bufferQueue_ = consumer_analyze->CreateProducerSeq([this](void* addr, uint32_t size) {
305         common_metadata_header_t *data = static_cast<common_metadata_header_t *>(addr);
306         camera_metadata_item_t entry = {};
307 
308         int ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_IDS, &entry);
309         if (ret == HDI::Camera::V1_0::NO_ERROR && entry.data.i32 != nullptr && entry.count > 0) {
310             for (size_t i = 0; i < entry.count; i++) {
311                 int id = entry.data.i32[i];
312                 CAMERA_LOGI("Face ids : %{public}d", id);
313             }
314         }
315 
316         ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_RECTANGLES, &entry);
317         if (ret == HDI::Camera::V1_0::NO_ERROR && entry.data.i32 != nullptr && entry.count > 0) {
318             for (size_t i = 0; i < entry.count; i++) {
319                 int id = entry.data.i32[i];
320                 CAMERA_LOGI("Face rectangles : %{public}d", id);
321             }
322         }
323     });
324     infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
325     consumerMap_[StreamIntent::ANALYZE] = consumer_analyze;
326 }
327 
StartProfessionalStream(std::vector<StreamIntent> intents,uint8_t professionalMode)328 void Test::StartProfessionalStream(std::vector<StreamIntent> intents, uint8_t professionalMode)
329 {
330     streamOperatorCallbackV1_3 =
331         OHOS::sptr<OHOS::HDI::Camera::V1_3::IStreamOperatorCallback> (new TestStreamOperatorCallbackV1_3);
332     uint32_t mainVersion = 1;
333     uint32_t minVersion = 0;
334     rc = cameraDeviceV1_3->GetStreamOperator_V1_3(streamOperatorCallbackV1_3, streamOperator_V1_3);
335     if (rc == HDI::Camera::V1_0::NO_ERROR) {
336         rc = streamOperator_V1_3->GetVersion(mainVersion, minVersion);
337         if (rc != HDI::Camera::V1_0::NO_ERROR) {
338             CAMERA_LOGE("streamOperator_V1_3 get version failed, rc = %{public}d", rc);
339         } else {
340             CAMERA_LOGI("streamOperator_V1_3 get version success, %{public}u, %{public}u",
341                 mainVersion, minVersion);
342         }
343         CAMERA_LOGI("GetStreamOperator success");
344     } else {
345         CAMERA_LOGE("GetStreamOperator fail, rc = %{public}d", rc);
346     }
347     streamInfoPre = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
348     streamInfoVideo = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
349     streamInfoCapture = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
350     streamInfoAnalyze = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
351 
352     for (auto& streamType : intents) {
353         if (streamType == StreamIntent::PREVIEW) {
354             DefaultInfosPreview(streamInfoPre);
355             streamInfos.push_back(*streamInfoPre);
356         } else if (streamType == StreamIntent::VIDEO) {
357             DefaultInfosVideo(streamInfoVideo);
358             streamInfos.push_back(*streamInfoVideo);
359         } else if (streamType == StreamIntent::ANALYZE) {
360             DefaultInfosAnalyze(streamInfoAnalyze);
361             streamInfos.push_back(*streamInfoAnalyze);
362         } else {
363             DefaultInfosProfessionalCapture(streamInfoCapture);
364             streamInfos.push_back(*streamInfoCapture);
365         }
366     }
367 
368     rc = streamOperator_V1_3->CreateStreams_V1_1(streamInfos);
369     EXPECT_EQ(false, rc != HDI::Camera::V1_0::NO_ERROR);
370     rc = streamOperator_V1_3->CommitStreams_V1_1(
371         static_cast<OHOS::HDI::Camera::V1_1::OperationMode_V1_1>(professionalMode),
372         abilityVec);
373     EXPECT_EQ(false, rc != HDI::Camera::V1_0::NO_ERROR);
374     sleep(1);
375     std::vector<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>().swap(streamInfos);
376 }
377 
StartStream(std::vector<StreamIntent> intents,OHOS::HDI::Camera::V1_3::OperationMode mode)378 void Test::StartStream(std::vector<StreamIntent> intents, OHOS::HDI::Camera::V1_3::OperationMode mode)
379 {
380     streamOperatorCallbackV1_3 =
381         OHOS::sptr<OHOS::HDI::Camera::V1_3::IStreamOperatorCallback> (new TestStreamOperatorCallbackV1_3);
382     uint32_t mainVersion = 1;
383     uint32_t minVersion = 0;
384     rc = cameraDeviceV1_3->GetStreamOperator_V1_3(streamOperatorCallbackV1_3, streamOperator_V1_3);
385     if (rc == HDI::Camera::V1_0::NO_ERROR) {
386         rc = streamOperator_V1_3->GetVersion(mainVersion, minVersion);
387         if (rc != HDI::Camera::V1_0::NO_ERROR) {
388             CAMERA_LOGE("streamOperator_V1_3 get version failed, rc = %{public}d", rc);
389         } else {
390             CAMERA_LOGI("streamOperator_V1_3 get version success, %{public}u, %{public}u",
391                 mainVersion, minVersion);
392         }
393         CAMERA_LOGI("GetStreamOperator success");
394     } else {
395         CAMERA_LOGE("GetStreamOperator fail, rc = %{public}d", rc);
396     }
397     streamInfoPre = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
398     streamInfoVideo = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
399     streamInfoCapture = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
400     streamInfoAnalyze = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
401 
402     for (auto& intent : intents) {
403         if (intent == StreamIntent::PREVIEW) {
404             DefaultInfosPreview(streamInfoPre);
405             streamInfos.push_back(*streamInfoPre);
406         } else if (intent == StreamIntent::VIDEO) {
407             DefaultInfosVideo(streamInfoVideo);
408             streamInfos.push_back(*streamInfoVideo);
409         } else if (intent == StreamIntent::ANALYZE) {
410             DefaultInfosAnalyze(streamInfoAnalyze);
411             streamInfos.push_back(*streamInfoAnalyze);
412         } else {
413             DefaultInfosCapture(streamInfoCapture);
414             streamInfos.push_back(*streamInfoCapture);
415         }
416     }
417 
418     rc = streamOperator_V1_3->CreateStreams_V1_1(streamInfos);
419     EXPECT_EQ(false, rc != HDI::Camera::V1_0::NO_ERROR);
420     rc = streamOperator_V1_3->CommitStreams_V1_1(
421         static_cast<OHOS::HDI::Camera::V1_1::OperationMode_V1_1>(mode), abilityVec);
422     EXPECT_EQ(false, rc != HDI::Camera::V1_0::NO_ERROR);
423     sleep(1);
424     std::vector<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>().swap(streamInfos);
425 }
426 
StartCapture(int streamId,int captureId,bool shutterCallback,bool isStreaming)427 void Test::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)
428 {
429     captureInfo = std::make_shared<CaptureInfo>();
430     captureInfo->streamIds_ = {streamId};
431     captureInfo->captureSetting_ = abilityVec;
432     captureInfo->enableShutterCallback_ = shutterCallback;
433     EXPECT_EQ(true, streamOperator_V1_3 != nullptr);
434     rc = (CamRetCode)streamOperator_V1_3->Capture(captureId, *captureInfo, isStreaming);
435     EXPECT_EQ(true, rc == HDI::Camera::V1_0::NO_ERROR);
436     if (rc == HDI::Camera::V1_0::NO_ERROR) {
437         CAMERA_LOGI("check Capture: Capture success, %{public}d", captureId);
438     } else {
439         std::cout << "rc = " << rc << std::endl;
440         CAMERA_LOGE("check Capture: Capture fail, rc = %{public}d", rc);
441     }
442     sleep(UT_SLEEP_TIME);
443 }
444 
StopStream(std::vector<int> & captureIds,std::vector<int> & streamIds)445 void Test::StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds)
446 {
447     if (captureIds.size() > 0) {
448         for (auto &captureId : captureIds) {
449             EXPECT_EQ(true, streamOperator_V1_3 != nullptr);
450             rc = streamOperator_V1_3->CancelCapture(captureId);
451             EXPECT_EQ(true, rc == HDI::Camera::V1_0::NO_ERROR);
452             if (rc == HDI::Camera::V1_0::NO_ERROR) {
453                 CAMERA_LOGI("check Capture: CancelCapture success, %{public}d", captureId);
454             } else {
455                 CAMERA_LOGE("check Capture: CancelCapture fail, rc = %{public}d, captureId = %{public}d",
456                     rc, captureId);
457             }
458         }
459     }
460     if (streamIds.size() > 0) {
461         EXPECT_EQ(true, streamOperator_V1_3 != nullptr);
462         rc = streamOperator_V1_3->ReleaseStreams(streamIds);
463         EXPECT_EQ(true, rc == HDI::Camera::V1_0::NO_ERROR);
464         if (rc == HDI::Camera::V1_0::NO_ERROR) {
465             CAMERA_LOGI("check Capture: ReleaseStream success");
466         } else {
467             CAMERA_LOGE("check Capture: ReleaseStreams fail, rc = %{public}d", rc);
468         }
469     }
470 }
471 
CalculateFps(int64_t timestamp,int32_t streamId)472 void Test::StreamConsumer::CalculateFps(int64_t timestamp, int32_t streamId)
473 {
474     if (isFirstCalculateFps_) {
475         if ((timestamp - intervalTimestamp_) >= interval_) {
476             int64_t timeInterval = timestamp - intervalTimestamp_;
477             if (timeInterval != 0) {
478                 float fps = (int64_t)(100000000000 * timestampCount_ / timeInterval) / 100.0;
479                 CAMERA_LOGI("Calculate FPS success, streamId: %{public}d, Fps:%{public}f", streamId, fps);
480                 interval_ = ONESECOND_OF_MICROSECOND_UNIT;
481             } else {
482                 CAMERA_LOGE("Calculate FPS error timeInerval is 0");
483             }
484         }
485     } else {
486         intervalTimestamp_ = timestamp;
487         isFirstCalculateFps_ = true;
488     }
489     if ((timestamp - intervalTimestamp_) >= ONESECOND_OF_MICROSECOND_UNIT * UT_SECOND_TIMES) {
490         intervalTimestamp_ = timestamp;
491         timestampCount_ = 0;
492         interval_ = ONESECOND_OF_MICROSECOND_UNIT;
493     }
494     timestampCount_++;
495 }
496 
GetTimeStamp(int64_t * g_timestamp,uint32_t lenght,int64_t timestamp,int32_t gotSize)497 void Test::StreamConsumer::GetTimeStamp(int64_t *g_timestamp, uint32_t lenght, int64_t timestamp, int32_t gotSize)
498 {
499     if (gotSize != UT_PREVIEW_SIZE) {
500         if (g_timestamp[0] == 0) {
501             g_timestamp[0] = timestamp;
502         } else {
503             g_timestamp[1] = timestamp;
504         }
505     }
506 }
507 
CreateProducer(std::function<void (void *,uint32_t)> callback)508 OHOS::sptr<OHOS::IBufferProducer> Test::StreamConsumer::CreateProducer(std::function<void(void*, uint32_t)> callback)
509 {
510     consumer_ = OHOS::IConsumerSurface::Create();
511     if (consumer_ == nullptr) {
512         return nullptr;
513     }
514     sptr<IBufferConsumerListener> listener = new TestBufferConsumerListener();
515     consumer_->RegisterConsumerListener(listener);
516     auto producer = consumer_->GetProducer();
517     if (producer == nullptr) {
518         return nullptr;
519     }
520 
521     callback_ = callback;
522     consumerThread_ = new std::thread([this, listener] {
523         int32_t flushFence = 0;
524         int64_t timestamp = 0;
525         OHOS::Rect damage;
526         TestBufferConsumerListener* checker = static_cast<TestBufferConsumerListener*>(listener.GetRefPtr());
527         while (running_ == true) {
528             OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr;
529             if (checker->checkBufferAvailable()) {
530                 consumer_->AcquireBuffer(buffer, flushFence, timestamp, damage);
531                 if (buffer != nullptr) {
532                     void* addr = buffer->GetVirAddr();
533                     uint32_t size = buffer->GetSize();
534 
535                     int32_t gotSize = 0;
536                     int32_t isKey = 0;
537                     int32_t streamId = 0;
538                     int32_t captureId = 0;
539                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::dataSize, gotSize);
540                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::isKeyFrame, isKey);
541                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::timeStamp, timestamp);
542                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::streamId, streamId);
543                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::captureId, captureId);
544                     GetTimeStamp(g_timestamp, sizeof(g_timestamp) / sizeof(g_timestamp[0]), timestamp, gotSize);
545                     if (gotSize) {
546                         CalculateFps(timestamp, streamId);
547                         callback_(addr, gotSize);
548                     } else {
549                         callback_(addr, size);
550                     }
551 
552                     consumer_->ReleaseBuffer(buffer, -1);
553                     shotCount_--;
554                     if (shotCount_ == 0) {
555                         std::unique_lock<std::mutex> l(l_);
556                         cv_.notify_one();
557                     }
558                 }
559             }
560             if (running_ == false) {
561                 break;
562             }
563             usleep(1);
564         }
565     });
566 
567     return producer;
568 }
569 
CreateProducerSeq(std::function<void (void *,uint32_t)> callback)570 OHOS::sptr<BufferProducerSequenceable> Test::StreamConsumer::CreateProducerSeq(
571     std::function<void(void*, uint32_t)> callback)
572 {
573     OHOS::sptr<OHOS::IBufferProducer> producer = CreateProducer(callback);
574     if (producer == nullptr) {
575         return nullptr;
576     }
577 
578     return new BufferProducerSequenceable(producer);
579 }
580 
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamId)581 int32_t Test::TestStreamOperatorCallback::OnCaptureStarted(int32_t captureId, const std::vector<int32_t> &streamId)
582 {
583     for (auto it : streamId) {
584         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
585     }
586     return HDI::Camera::V1_0::NO_ERROR;
587 }
588 
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)589 int32_t Test::TestStreamOperatorCallback::OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo> &infos)
590 {
591     for (auto it : infos) {
592         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_,
593             it.frameCount_);
594     }
595     return HDI::Camera::V1_0::NO_ERROR;
596 }
597 
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)598 int32_t Test::TestStreamOperatorCallback::OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo> &infos)
599 {
600     for (auto it : infos) {
601         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_,
602             it.error_);
603     }
604     return HDI::Camera::V1_0::NO_ERROR;
605 }
606 
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)607 int32_t Test::TestStreamOperatorCallback::OnFrameShutter(int32_t captureId,
608     const std::vector<int32_t> &streamIds, uint64_t timestamp)
609 {
610     (void)timestamp;
611     for (auto it : streamIds) {
612         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
613     }
614     return HDI::Camera::V1_0::NO_ERROR;
615 }
616 
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamId)617 int32_t Test::TestStreamOperatorCallbackV1_2::OnCaptureStarted(int32_t captureId, const std::vector<int32_t> &streamId)
618 {
619     return instanceImpl.OnCaptureStarted(captureId, streamId);
620 }
621 
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)622 int32_t Test::TestStreamOperatorCallbackV1_2::OnCaptureEnded(int32_t captureId,
623     const std::vector<CaptureEndedInfo> &infos)
624 {
625     return instanceImpl.OnCaptureEnded(captureId, infos);
626 }
627 
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)628 int32_t Test::TestStreamOperatorCallbackV1_2::OnCaptureError(int32_t captureId,
629     const std::vector<CaptureErrorInfo> &infos)
630 {
631     return instanceImpl.OnCaptureError(captureId, infos);
632 }
633 
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)634 int32_t Test::TestStreamOperatorCallbackV1_2::OnFrameShutter(int32_t captureId,
635     const std::vector<int32_t> &streamIds, uint64_t timestamp)
636 {
637     return instanceImpl.OnFrameShutter(captureId, streamIds, timestamp);
638 }
639 
OnCaptureStarted_V1_2(int32_t captureId,const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> & infos)640 int32_t Test::TestStreamOperatorCallbackV1_2::OnCaptureStarted_V1_2(int32_t captureId,
641     const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> &infos)
642 {
643     for (auto it : infos) {
644         CAMERA_LOGI("captureId: %{public}d, streamId: %{public}d", captureId, it.streamId_);
645     }
646     return HDI::Camera::V1_0::NO_ERROR;
647 }
648 
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamId)649 int32_t Test::TestStreamOperatorCallbackV1_3::OnCaptureStarted(int32_t captureId, const std::vector<int32_t> &streamId)
650 {
651     return instanceImpl.OnCaptureStarted(captureId, streamId);
652 }
653 
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)654 int32_t Test::TestStreamOperatorCallbackV1_3::OnCaptureEnded(int32_t captureId,
655     const std::vector<CaptureEndedInfo> &infos)
656 {
657     return instanceImpl.OnCaptureEnded(captureId, infos);
658 }
659 
OnCaptureEndedExt(int32_t captureId,const std::vector<HDI::Camera::V1_3::CaptureEndedInfoExt> & infos)660 int32_t Test::TestStreamOperatorCallbackV1_3::OnCaptureEndedExt(int32_t captureId,
661     const std::vector<HDI::Camera::V1_3::CaptureEndedInfoExt> &infos)
662 {
663     for (auto it : infos) {
664         CAMERA_LOGI("OnCaptureEndedExt captureId: %{public}d, streamId: %{public}d", captureId, it.streamId_);
665     }
666     return HDI::Camera::V1_0::NO_ERROR;
667 }
668 
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)669 int32_t Test::TestStreamOperatorCallbackV1_3::OnCaptureError(int32_t captureId,
670     const std::vector<CaptureErrorInfo> &infos)
671 {
672     return instanceImpl.OnCaptureError(captureId, infos);
673 }
674 
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)675 int32_t Test::TestStreamOperatorCallbackV1_3::OnFrameShutter(int32_t captureId,
676     const std::vector<int32_t> &streamIds, uint64_t timestamp)
677 {
678     (void)timestamp;
679     for (auto it : streamIds) {
680         CAMERA_LOGI("OnFrameShutter captureId: %{public}d, streamId: %{public}d", captureId, it);
681     }
682     return instanceImpl.OnFrameShutter(captureId, streamIds, timestamp);
683 }
684 
OnCaptureStarted_V1_2(int32_t captureId,const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> & infos)685 int32_t Test::TestStreamOperatorCallbackV1_3::OnCaptureStarted_V1_2(int32_t captureId,
686     const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> &infos)
687 {
688     return instanceImpl.OnCaptureStarted_V1_2(captureId, infos);
689 }
690 
OnCaptureReady(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)691 int32_t Test::TestStreamOperatorCallbackV1_3::OnCaptureReady(int32_t captureId,
692     const std::vector<int32_t> &streamIds, uint64_t timestamp)
693 {
694     (void)timestamp;
695     for (auto it : streamIds) {
696         CAMERA_LOGI("OnCaptureReady captureId: %{public}d, streamId: %{public}d", captureId, it);
697     }
698     return HDI::Camera::V1_0::NO_ERROR;
699 }
700 
OnFrameShutterEnd(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)701 int32_t Test::TestStreamOperatorCallbackV1_3::OnFrameShutterEnd(int32_t captureId,
702     const std::vector<int32_t> &streamIds, uint64_t timestamp)
703 {
704     (void)timestamp;
705     for (auto it : streamIds) {
706         CAMERA_LOGI("OnFrameShutterEnd captureId: %{public}d, streamId: %{public}d", captureId, it);
707     }
708     return HDI::Camera::V1_0::NO_ERROR;
709 }
710 
OnError(ErrorType type,int32_t errorMsg)711 int32_t Test::DemoCameraDeviceCallback::OnError(ErrorType type, int32_t errorMsg)
712 {
713     CAMERA_LOGE("type: %{public}d, errorMsg: %{public}d", type, errorMsg);
714     return HDI::Camera::V1_0::NO_ERROR;
715 }
716 
OnResult(uint64_t timestamp,const std::vector<uint8_t> & result)717 int32_t Test::DemoCameraDeviceCallback::OnResult(uint64_t timestamp, const std::vector<uint8_t> &result)
718 {
719     MetadataUtils::ConvertVecToMetadata(result, resultMeta);
720     if (Test::resultCallback_) {
721         Test::resultCallback_(timestamp, resultMeta);
722     }
723     return HDI::Camera::V1_0::NO_ERROR;
724 }
725 
OnCameraStatus(const std::string & cameraId,CameraStatus status)726 int32_t Test::TestCameraHostCallback::OnCameraStatus(const std::string& cameraId, CameraStatus status)
727 {
728     CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
729     return HDI::Camera::V1_0::NO_ERROR;
730 }
731 
OnFlashlightStatus(const std::string & cameraId,FlashlightStatus status)732 int32_t Test::TestCameraHostCallback::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus 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 
OnCameraEvent(const std::string & cameraId,CameraEvent event)738 int32_t Test::TestCameraHostCallback::OnCameraEvent(const std::string& cameraId, CameraEvent event)
739 {
740     CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), event);
741     return HDI::Camera::V1_0::NO_ERROR;
742 }
743 
OnCameraStatus(const std::string & cameraId,CameraStatus status)744 int32_t Test::TestCameraHostCallbackV1_2::OnCameraStatus(const std::string& cameraId, CameraStatus status)
745 {
746     return instanceImpl.OnCameraStatus(cameraId, status);
747 }
748 
OnFlashlightStatus(const std::string & cameraId,FlashlightStatus status)749 int32_t Test::TestCameraHostCallbackV1_2::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status)
750 {
751     return instanceImpl.OnFlashlightStatus(cameraId, status);
752 }
753 
OnCameraEvent(const std::string & cameraId,CameraEvent event)754 int32_t Test::TestCameraHostCallbackV1_2::OnCameraEvent(const std::string& cameraId, CameraEvent event)
755 {
756     return instanceImpl.OnCameraEvent(cameraId, event);
757 }
758 
OnFlashlightStatus_V1_2(FlashlightStatus status)759 int32_t Test::TestCameraHostCallbackV1_2::OnFlashlightStatus_V1_2(FlashlightStatus status)
760 {
761     CAMERA_LOGE("status: %{public}d", status);
762     Test::statusCallback = status;
763     return HDI::Camera::V1_0::NO_ERROR;
764 }
765 } // OHOS::Camera