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