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 
GetCurrentLocalTimeStamp()23 uint64_t Test::GetCurrentLocalTimeStamp()
24 {
25     std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp =
26         std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
27     auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
28     return static_cast<uint64_t>(tmp.count());
29 }
30 
DumpImageFile(int streamId,std::string suffix,const void * buffer,int32_t size)31 int32_t Test::DumpImageFile(int streamId, std::string suffix, const void* buffer, int32_t size)
32 {
33     if (imageDataSaveSwitch == SWITCH_OFF) {
34         return 0;
35     }
36     if (streamId < 0) {
37         CAMERA_LOGE("ivalid stream id: %{public}d", streamId);
38         return -1;
39     }
40     char mkdirCmd[PATH_MAX] = {0};
41     char path[PATH_MAX] = {0};
42     int ret = sprintf_s(mkdirCmd, sizeof(mkdirCmd) / sizeof(mkdirCmd[0]),
43         "mkdir -p /data/stream-%d", streamId);
44     if (ret < 0) {
45         return -1;
46     }
47     system(mkdirCmd);
48     ret = sprintf_s(path, sizeof(path) / sizeof(path[0]), "data/stream-%d/%lld.%s",
49         streamId, GetCurrentLocalTimeStamp(), suffix.c_str());
50     if (ret < 0) {
51         return -1;
52     }
53 
54     int imgFd = open(path, O_RDWR | O_CREAT, 00766);
55     if (imgFd == -1) {
56         CAMERA_LOGE("open file failed, errno: %{public}s", strerror(errno));
57         return -1;
58     }
59 
60     ret = write(imgFd, buffer, size);
61     if (ret == -1) {
62         CAMERA_LOGE("write file failed, error: %{public}s", strerror(errno));
63         close(imgFd);
64         return -1;
65     }
66     close(imgFd);
67     return 0;
68 }
69 
Init()70 void Test::Init()
71 {
72     uint32_t mainVer;
73     uint32_t minVer;
74     int32_t ret;
75     if (serviceV1_2 == nullptr) {
76         serviceV1_2 = OHOS::HDI::Camera::V1_2::ICameraHost::Get("camera_service", false);
77         if (serviceV1_2 == nullptr) {
78             CAMERA_LOGE("V1_2::ICameraHost get failed");
79             return;
80         } else {
81             CAMERA_LOGI("ICameraHost get success");
82             ret = serviceV1_2->GetVersion(mainVer, minVer);
83             if (ret != 0) {
84                 CAMERA_LOGE("V1_1::ICameraHost get version failed, ret = %{public}d", ret);
85             } else {
86                 CAMERA_LOGE("V1_1::ICameraHost get version success, %{public}d, %{public}d", mainVer, minVer);
87             }
88         }
89         ASSERT_TRUE(serviceV1_2 != nullptr);
90         service = static_cast<OHOS::HDI::Camera::V1_0::ICameraHost *>(serviceV1_2.GetRefPtr());
91     }
92     hostCallback = new TestCameraHostCallback();
93     service->SetCallback(hostCallback);
94 }
95 
GetCameraMetadata(int cameraId)96 void Test::GetCameraMetadata(int cameraId)
97 {
98     if (cameraId == DEVICE_1) {
99         rc = service->GetCameraAbility(cameraIds[1], abilityVec);
100     } else {
101         rc = service->GetCameraAbility(cameraIds[0], abilityVec);
102     }
103     if (rc != HDI::Camera::V1_0::NO_ERROR) {
104         CAMERA_LOGE("GetCameraAbility failed, rc = %{public}d", rc);
105     }
106     MetadataUtils::ConvertVecToMetadata(abilityVec, ability);
107 
108     common_metadata_header_t* data = ability->get();
109     camera_metadata_item_t entry;
110     int ret = FindCameraMetadataItem(data, OHOS_CONTROL_AE_AVAILABLE_MODES, &entry);
111     if (ret == 0) {
112         CAMERA_LOGI("get OHOS_CONTROL_AE_AVAILABLE_MODES success");
113     }
114 }
115 
Open(int cameraId)116 void Test::Open(int cameraId)
117 {
118     if (cameraDevice == nullptr) {
119         service->GetCameraIds(cameraIds);
120         if (cameraIds.size() == 0) {
121             CAMERA_LOGE("camera device list empty");
122         }
123         ASSERT_TRUE(cameraIds.size() != 0);
124         GetCameraMetadata(cameraId);
125         deviceCallback = new OHOS::Camera::Test::DemoCameraDeviceCallback();
126 
127         ASSERT_TRUE(serviceV1_2 != nullptr);
128         if (cameraId == DEVICE_1) {
129             rc = serviceV1_2->OpenCamera_V1_1(cameraIds[1], deviceCallback, cameraDeviceV1_1);
130         } else {
131             rc = serviceV1_2->OpenCamera_V1_1(cameraIds[0], deviceCallback, cameraDeviceV1_1);
132         }
133         if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_1 == nullptr) {
134             CAMERA_LOGE("openCamera V1_1 failed, rc = %{public}d", rc);
135             return;
136         }
137         ASSERT_TRUE(cameraDeviceV1_1 != nullptr);
138         cameraDevice = static_cast<OHOS::HDI::Camera::V1_0::ICameraDevice *>(cameraDeviceV1_1.GetRefPtr());
139         CAMERA_LOGI("OpenCamera V1_1 success");
140     }
141 }
142 
OpenCameraV1_2(int cameraId)143 void Test::OpenCameraV1_2(int cameraId)
144 {
145     if (cameraDevice == nullptr) {
146         EXPECT_NE(service, nullptr);
147         service->GetCameraIds(cameraIds);
148         EXPECT_NE(cameraIds.size(), 0);
149         GetCameraMetadata(cameraId);
150         deviceCallback = new OHOS::Camera::Test::DemoCameraDeviceCallback();
151 
152         EXPECT_NE(serviceV1_2, nullptr);
153         if (cameraId == DEVICE_1) {
154             rc = serviceV1_2->OpenCamera_V1_2(cameraIds[1], deviceCallback, cameraDeviceV1_2);
155         } else {
156             rc = serviceV1_2->OpenCamera_V1_2(cameraIds[0], deviceCallback, cameraDeviceV1_2);
157         }
158         EXPECT_EQ(rc, HDI::Camera::V1_0::NO_ERROR);
159         EXPECT_NE(cameraDeviceV1_2, nullptr);
160         cameraDevice = static_cast<OHOS::HDI::Camera::V1_0::ICameraDevice *>(cameraDeviceV1_2.GetRefPtr());
161         CAMERA_LOGI("OpenCamera V1_2 success");
162     }
163 }
164 
Close()165 void Test::Close()
166 {
167     if (cameraDevice != nullptr) {
168         cameraDevice->Close();
169         cameraDevice = nullptr;
170     }
171 }
172 
StartStream(std::vector<StreamIntent> intents)173 void Test::StartStream(std::vector<StreamIntent> intents)
174 {
175     streamOperatorCallback = new TestStreamOperatorCallback();
176     uint32_t mainVersion = 1;
177     uint32_t minVersion = 0;
178     rc = cameraDeviceV1_1->GetStreamOperator_V1_1(streamOperatorCallback, streamOperator_V1_1);
179     if (rc == HDI::Camera::V1_0::NO_ERROR) {
180         rc = streamOperator_V1_1->GetVersion(mainVersion, minVersion);
181         streamOperator = static_cast<OHOS::HDI::Camera::V1_0::IStreamOperator *>(streamOperator_V1_1.GetRefPtr());
182         if (rc != HDI::Camera::V1_0::NO_ERROR) {
183             CAMERA_LOGE("StreamOperator V1_1 get version failed, rc = %{public}d", rc);
184         } else {
185             CAMERA_LOGI("StreamOperator V1_1 get version success, %{public}u, %{public}u",
186                 mainVersion, minVersion);
187         }
188         CAMERA_LOGI("GetStreamOperator success");
189     } else {
190         CAMERA_LOGE("GetStreamOperator fail, rc = %{public}d", rc);
191     }
192     streamInfoPre = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
193     streamInfoVideo = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
194     streamInfoCapture = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
195     streamInfoAnalyze = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
196     for (auto& intent : intents) {
197         if (intent == StreamIntent::PREVIEW) {
198             streamInfoPre->v1_0.streamId_ = streamIdPreview;
199             streamInfoPre->v1_0.width_ = previewWidth;
200             streamInfoPre->v1_0.height_ = previewHeight;
201             streamInfoPre->v1_0.format_ = previewFormat;
202             streamInfoPre->v1_0.dataspace_ = UT_DATA_SIZE;
203             streamInfoPre->v1_0.intent_ = intent;
204             streamInfoPre->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
205             std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
206             streamInfoPre->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
207                 DumpImageFile(streamIdPreview, "yuv", addr, size);
208             });
209             streamInfoPre->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
210             consumerMap_[intent] = consumer_pre;
211             streamInfos.push_back(*streamInfoPre);
212         } else if (intent == StreamIntent::VIDEO) {
213             streamInfoVideo->v1_0.streamId_ = streamIdVideo;
214             streamInfoVideo->v1_0.width_ = videoWidth;
215             streamInfoVideo->v1_0.height_ = videoHeight;
216             streamInfoVideo->v1_0.format_ = videoFormat;
217             streamInfoVideo->v1_0.dataspace_ = UT_DATA_SIZE;
218             streamInfoVideo->v1_0.intent_ = intent;
219             streamInfoVideo->v1_0.encodeType_ = ENCODE_TYPE_H265;
220             streamInfoVideo->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
221             std::shared_ptr<StreamConsumer> consumer_video = std::make_shared<StreamConsumer>();
222             streamInfoVideo->v1_0.bufferQueue_ = consumer_video->CreateProducerSeq([this](void* addr, uint32_t size) {
223                 DumpImageFile(streamIdPreview, "yuv", addr, size);
224             });
225             streamInfoVideo->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
226             consumerMap_[intent] = consumer_video;
227             streamInfos.push_back(*streamInfoVideo);
228         } else if (intent == StreamIntent::ANALYZE) {
229             streamInfoAnalyze->v1_0.streamId_ = streamIdAnalyze;
230             streamInfoAnalyze->v1_0.width_ = analyzeWidth;
231             streamInfoAnalyze->v1_0.height_ = analyzeHeight;
232             streamInfoAnalyze->v1_0.format_ = analyzeFormat;
233             streamInfoAnalyze->v1_0.dataspace_ = UT_DATA_SIZE;
234             streamInfoAnalyze->v1_0.intent_ = intent;
235             streamInfoAnalyze->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
236 
237             std::shared_ptr<StreamConsumer> consumer_analyze = std::make_shared<StreamConsumer>();
238             streamInfoAnalyze->v1_0.bufferQueue_ =
239                 consumer_analyze->CreateProducerSeq([this](void* addr, uint32_t size) {
240                 common_metadata_header_t *data = static_cast<common_metadata_header_t *>(addr);
241                 camera_metadata_item_t entry = {};
242 
243                 int ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_IDS, &entry);
244                 if (ret == 0) {
245                     for (size_t i = 0; i < entry.count; i++) {
246                         int id = entry.data.i32[i];
247                         CAMERA_LOGI("Face ids : %{public}d", id);
248                     }
249                 }
250 
251                 ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_RECTANGLES, &entry);
252                 if (ret == 0) {
253                     for (size_t i = 0; i < entry.count; i++) {
254                         int id = entry.data.i32[i];
255                         CAMERA_LOGI("Face rectangles : %{public}d", id);
256                     }
257                 }
258             });
259             streamInfoAnalyze->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
260             consumerMap_[intent] = consumer_analyze;
261             streamInfos.push_back(*streamInfoAnalyze);
262         } else {
263             streamInfoCapture->v1_0.streamId_ = streamIdAnalyze;
264             streamInfoCapture->v1_0.width_ = analyzeWidth;
265             streamInfoCapture->v1_0.height_ = analyzeHeight;
266             streamInfoCapture->v1_0.format_ = analyzeFormat;
267             streamInfoCapture->v1_0.dataspace_ = UT_DATA_SIZE;
268             streamInfoCapture->v1_0.intent_ = intent;
269             streamInfoCapture->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
270             std::shared_ptr<StreamConsumer> consumer_capture = std::make_shared<StreamConsumer>();
271             streamInfoCapture->v1_0.bufferQueue_ =
272                 consumer_capture->CreateProducerSeq([this](void* addr, uint32_t size) {
273                 DumpImageFile(streamIdPreview, "yuv", addr, size);
274             });
275             streamInfoCapture->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
276             consumerMap_[intent] = consumer_capture;
277             streamInfos.push_back(*streamInfoCapture);
278         }
279     }
280 
281     rc = streamOperator_V1_1->CreateStreams_V1_1(streamInfos);
282     EXPECT_EQ(false, rc != HDI::Camera::V1_0::NO_ERROR);
283     rc = streamOperator_V1_1->CommitStreams(OperationMode::NORMAL, abilityVec);
284     EXPECT_EQ(false, rc != HDI::Camera::V1_0::NO_ERROR);
285     sleep(1);
286     std::vector<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>().swap(streamInfos);
287 }
288 
StartCapture(int streamId,int captureId,bool shutterCallback,bool isStreaming)289 void Test::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)
290 {
291     captureInfo = std::make_shared<CaptureInfo>();
292     captureInfo->streamIds_ = {streamId};
293     captureInfo->captureSetting_ = abilityVec;
294     captureInfo->enableShutterCallback_ = shutterCallback;
295     if (streamOperator_V1_2 != nullptr) {
296         rc = (CamRetCode)streamOperator_V1_2->Capture(captureId, *captureInfo, isStreaming);
297     } else if (streamOperator_V1_1 != nullptr) {
298         rc = (CamRetCode)streamOperator_V1_1->Capture(captureId, *captureInfo, isStreaming);
299     } else {
300         rc = (CamRetCode)streamOperator->Capture(captureId, *captureInfo, isStreaming);
301     }
302     EXPECT_EQ(true, rc == HDI::Camera::V1_0::NO_ERROR);
303     if (rc == HDI::Camera::V1_0::NO_ERROR) {
304         CAMERA_LOGI("check Capture: Capture success, %{public}d", captureId);
305     } else {
306         std::cout << "rc = " << rc << std::endl;
307         CAMERA_LOGE("check Capture: Capture fail, rc = %{public}d", rc);
308     }
309     sleep(UT_SLEEP_TIME);
310 }
311 
StopStream(std::vector<int> & captureIds,std::vector<int> & streamIds)312 void Test::StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds)
313 {
314     if (captureIds.size() > 0) {
315         for (auto &captureId : captureIds) {
316             if (streamOperator_V1_2 != nullptr) {
317                 rc = streamOperator_V1_2->CancelCapture(captureId);
318             } else if (streamOperator_V1_1 != nullptr) {
319                 rc = streamOperator_V1_1->CancelCapture(captureId);
320             } else {
321                 rc = streamOperator->CancelCapture(captureId);
322             }
323             EXPECT_EQ(true, rc == HDI::Camera::V1_0::NO_ERROR);
324             if (rc == HDI::Camera::V1_0::NO_ERROR) {
325                 CAMERA_LOGI("check Capture: CancelCapture success, %{public}d", captureId);
326             } else {
327                 CAMERA_LOGE("check Capture: CancelCapture fail, rc = %{public}d, captureId = %{public}d",
328                     rc, captureId);
329             }
330         }
331     }
332     if (streamIds.size() > 0) {
333         if (streamOperator_V1_2 != nullptr) {
334             rc = streamOperator_V1_2->ReleaseStreams(streamIds);
335         } else if (streamOperator_V1_1 != nullptr) {
336             rc = streamOperator_V1_1->ReleaseStreams(streamIds);
337         } else {
338             rc = streamOperator->ReleaseStreams(streamIds);
339         }
340         EXPECT_EQ(true, rc == HDI::Camera::V1_0::NO_ERROR);
341         if (rc == HDI::Camera::V1_0::NO_ERROR) {
342             CAMERA_LOGI("check Capture: ReleaseStream success");
343         } else {
344             CAMERA_LOGE("check Capture: ReleaseStreams fail, rc = %{public}d", rc);
345         }
346     }
347 }
348 
CalculateFps(int64_t timestamp,int32_t streamId)349 void Test::StreamConsumer::CalculateFps(int64_t timestamp, int32_t streamId)
350 {
351     if (isFirstCalculateFps_) {
352         if ((timestamp - intervalTimestamp_) >= interval_) {
353             int64_t timeInterval = timestamp - intervalTimestamp_;
354             if (timeInterval != 0) {
355                 float fps = (int64_t)(100000000000 * timestampCount_ / timeInterval) / 100.0;
356                 CAMERA_LOGI("Calculate FPS success, streamId: %{public}d, Fps:%{public}f", streamId, fps);
357                 interval_ = ONESECOND_OF_MICROSECOND_UNIT;
358             } else {
359                 CAMERA_LOGE("Calculate FPS error timeInerval is 0");
360             }
361         }
362     } else {
363         intervalTimestamp_ = timestamp;
364         isFirstCalculateFps_ = true;
365     }
366     if ((timestamp - intervalTimestamp_) >= ONESECOND_OF_MICROSECOND_UNIT * UT_SECOND_TIMES) {
367         intervalTimestamp_ = timestamp;
368         timestampCount_ = 0;
369         interval_ = ONESECOND_OF_MICROSECOND_UNIT;
370     }
371     timestampCount_++;
372 }
373 
CreateProducer(std::function<void (void *,uint32_t)> callback)374 OHOS::sptr<OHOS::IBufferProducer> Test::StreamConsumer::CreateProducer(std::function<void(void*, uint32_t)> callback)
375 {
376     consumer_ = OHOS::IConsumerSurface::Create();
377     if (consumer_ == nullptr) {
378         return nullptr;
379     }
380     sptr<IBufferConsumerListener> listener = new TestBufferConsumerListener();
381     consumer_->RegisterConsumerListener(listener);
382     auto producer = consumer_->GetProducer();
383     if (producer == nullptr) {
384         return nullptr;
385     }
386 
387     callback_ = callback;
388     consumerThread_ = new std::thread([this, listener] {
389         int32_t flushFence = 0;
390         int64_t timestamp = 0;
391         OHOS::Rect damage;
392         TestBufferConsumerListener* checker = static_cast<TestBufferConsumerListener*>(listener.GetRefPtr());
393         while (running_ == true) {
394             OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr;
395             if (checker->checkBufferAvailable()) {
396                 consumer_->AcquireBuffer(buffer, flushFence, timestamp, damage);
397                 if (buffer != nullptr) {
398                     void* addr = buffer->GetVirAddr();
399                     uint32_t size = buffer->GetSize();
400 
401                     int32_t gotSize = 0;
402                     int32_t isKey = 0;
403                     int32_t streamId = 0;
404                     int32_t captureId = 0;
405                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::dataSize, gotSize);
406                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::isKeyFrame, isKey);
407                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::timeStamp, timestamp);
408                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::streamId, streamId);
409                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::captureId, captureId);
410                     if (gotSize) {
411                         CalculateFps(timestamp, streamId);
412                         callback_(addr, gotSize);
413                     } else {
414                         callback_(addr, size);
415                     }
416 
417                     consumer_->ReleaseBuffer(buffer, -1);
418                     shotCount_--;
419                     if (shotCount_ == 0) {
420                         std::unique_lock<std::mutex> l(l_);
421                         cv_.notify_one();
422                     }
423                 }
424             }
425             if (running_ == false) {
426                 break;
427             }
428             usleep(1);
429         }
430     });
431 
432     return producer;
433 }
434 
CreateProducerSeq(std::function<void (void *,uint32_t)> callback)435 OHOS::sptr<BufferProducerSequenceable> Test::StreamConsumer::CreateProducerSeq(
436     std::function<void(void*, uint32_t)> callback)
437 {
438     OHOS::sptr<OHOS::IBufferProducer> producer = CreateProducer(callback);
439     if (producer == nullptr) {
440         return nullptr;
441     }
442 
443     return new BufferProducerSequenceable(producer);
444 }
445 
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamId)446 int32_t Test::TestStreamOperatorCallback::OnCaptureStarted(int32_t captureId, const std::vector<int32_t> &streamId)
447 {
448     for (auto it : streamId) {
449         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
450     }
451     return HDI::Camera::V1_0::NO_ERROR;
452 }
453 
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)454 int32_t Test::TestStreamOperatorCallback::OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo> &infos)
455 {
456     for (auto it : infos) {
457         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_,
458             it.frameCount_);
459     }
460     return HDI::Camera::V1_0::NO_ERROR;
461 }
462 
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)463 int32_t Test::TestStreamOperatorCallback::OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo> &infos)
464 {
465     for (auto it : infos) {
466         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_,
467             it.error_);
468     }
469     return HDI::Camera::V1_0::NO_ERROR;
470 }
471 
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)472 int32_t Test::TestStreamOperatorCallback::OnFrameShutter(int32_t captureId,
473     const std::vector<int32_t> &streamIds, uint64_t timestamp)
474 {
475     (void)timestamp;
476     for (auto it : streamIds) {
477         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
478     }
479     return HDI::Camera::V1_0::NO_ERROR;
480 }
481 
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamId)482 int32_t Test::TestStreamOperatorCallbackV1_2::OnCaptureStarted(int32_t captureId, const std::vector<int32_t> &streamId)
483 {
484     for (auto it : streamId) {
485         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
486     }
487     return HDI::Camera::V1_0::NO_ERROR;
488 }
489 
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)490 int32_t Test::TestStreamOperatorCallbackV1_2::OnCaptureEnded(int32_t captureId,
491     const std::vector<CaptureEndedInfo> &infos)
492 {
493     for (auto it : infos) {
494         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_,
495             it.frameCount_);
496     }
497     return HDI::Camera::V1_0::NO_ERROR;
498 }
499 
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)500 int32_t Test::TestStreamOperatorCallbackV1_2::OnCaptureError(int32_t captureId,
501     const std::vector<CaptureErrorInfo> &infos)
502 {
503     for (auto it : infos) {
504         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_,
505             it.error_);
506     }
507     return HDI::Camera::V1_0::NO_ERROR;
508 }
509 
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)510 int32_t Test::TestStreamOperatorCallbackV1_2::OnFrameShutter(int32_t captureId,
511     const std::vector<int32_t> &streamIds, uint64_t timestamp)
512 {
513     (void)timestamp;
514     for (auto it : streamIds) {
515         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
516     }
517     return HDI::Camera::V1_0::NO_ERROR;
518 }
519 
OnCaptureStarted_V1_2(int32_t captureId,const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> & infos)520 int32_t Test::TestStreamOperatorCallbackV1_2::OnCaptureStarted_V1_2(int32_t captureId,
521     const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> &infos)
522 {
523     for (auto it : infos) {
524         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it.streamId_);
525     }
526     return HDI::Camera::V1_0::NO_ERROR;
527 }
528 
OnError(ErrorType type,int32_t errorMsg)529 int32_t Test::DemoCameraDeviceCallback::OnError(ErrorType type, int32_t errorMsg)
530 {
531     CAMERA_LOGE("type: %{public}d, errorMsg: %{public}d", type, errorMsg);
532     return HDI::Camera::V1_0::NO_ERROR;
533 }
534 
OnResult(uint64_t timestamp,const std::vector<uint8_t> & result)535 int32_t Test::DemoCameraDeviceCallback::OnResult(uint64_t timestamp, const std::vector<uint8_t> &result)
536 {
537     if (Test::resultCallback_) {
538         std::shared_ptr<CameraMetadata> resultMeta;
539         MetadataUtils::ConvertVecToMetadata(result, resultMeta);
540         Test::resultCallback_(timestamp, resultMeta);
541     }
542     return HDI::Camera::V1_0::NO_ERROR;
543 }
544 
OnCameraStatus(const std::string & cameraId,CameraStatus status)545 int32_t Test::TestCameraHostCallback::OnCameraStatus(const std::string& cameraId, CameraStatus status)
546 {
547     CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
548     return HDI::Camera::V1_0::NO_ERROR;
549 }
550 
OnFlashlightStatus(const std::string & cameraId,FlashlightStatus status)551 int32_t Test::TestCameraHostCallback::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status)
552 {
553     CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
554     return HDI::Camera::V1_0::NO_ERROR;
555 }
556 
OnCameraEvent(const std::string & cameraId,CameraEvent event)557 int32_t Test::TestCameraHostCallback::OnCameraEvent(const std::string& cameraId, CameraEvent event)
558 {
559     CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), event);
560     return HDI::Camera::V1_0::NO_ERROR;
561 }
562 
DefferredImageTestInit()563 int32_t Test::DefferredImageTestInit()
564 {
565     constexpr const char* serviceName = "camera_image_process_service";
566     constexpr const int userId = 100;
567     // get ImageProcessService
568     imageProcessService_ = OHOS::HDI::Camera::V1_2::ImageProcessServiceProxy::Get(serviceName, false);
569     if (imageProcessService_ == nullptr) {
570         std::cout << "DefferredImageTestInit fail, imageProcessService_ == nullptr" << std::endl;
571         return -1;
572     }
573     imageProcessCallback_ = new OHOS::Camera::Test::TestImageProcessCallback();
574     if (imageProcessCallback_ == nullptr) {
575         std::cout << "DefferredImageTestInit fail, imageProcessCallback_ == nullptr" << std::endl;
576         return -1;
577     }
578     imageProcessService_->CreateImageProcessSession(userId, imageProcessCallback_, imageProcessSession_);
579     if (imageProcessSession_ == nullptr) {
580         std::cout << "DefferredImageTestInit fail, imageProcessSession_ == nullptr" << std::endl;
581         return -1;
582     }
583     return 0;
584 }
OnProcessDone(const std::string & imageId,const OHOS::HDI::Camera::V1_2::ImageBufferInfo & buffer)585 int32_t Test::TestImageProcessCallback::OnProcessDone(const std::string& imageId,
586     const OHOS::HDI::Camera::V1_2::ImageBufferInfo& buffer)
587 {
588     CAMERA_LOGI("imageId: %{public}s", imageId.c_str());
589     coutProcessDone_++;
590     curImageId_ = imageId;
591     curImageBufferInfo_ = buffer;
592     return 0;
593 }
594 
OnStatusChanged(OHOS::HDI::Camera::V1_2::SessionStatus status)595 int32_t Test::TestImageProcessCallback::OnStatusChanged(OHOS::HDI::Camera::V1_2::SessionStatus status)
596 {
597     CAMERA_LOGI("status: %{public}d", status);
598     curStatus_ = status;
599     coutStatusChanged_++;
600     return 0;
601 }
602 
OnError(const std::string & imageId,OHOS::HDI::Camera::V1_2::ErrorCode errorCode)603 int32_t Test::TestImageProcessCallback::OnError(const std::string& imageId, \
604     OHOS::HDI::Camera::V1_2::ErrorCode errorCode)
605 {
606     CAMERA_LOGI("imageId: %{public}s, errorCode: %{public}d", imageId.c_str(), errorCode);
607     curImageId_ = imageId;
608     curErrorCode_ = errorCode;
609     countError_++;
610     return 0;
611 }
612 }
613