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_1.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_1 == nullptr) {
76         serviceV1_1 = OHOS::HDI::Camera::V1_1::ICameraHost::Get("camera_service", false);
77         if (serviceV1_1 == nullptr) {
78             CAMERA_LOGE("V1_1::ICameraHost get failed");
79             return;
80         } else {
81             CAMERA_LOGI("ICameraHost get success");
82             ret = serviceV1_1->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_1 != nullptr);
90         service = static_cast<OHOS::HDI::Camera::V1_0::ICameraHost *>(serviceV1_1.GetRefPtr());
91     }
92     hostCallback = new TestCameraHostCallback();
93     service->SetCallback(hostCallback);
94 }
95 
GetCameraMetadata(int cameraId)96 void Test::GetCameraMetadata(int cameraId)
97 {
98     if (DEVICE_1 == cameraId) {
99         // front camera
100         rc = service->GetCameraAbility(cameraIds[1], abilityVec);
101     } else {
102         // rear camera
103         rc = service->GetCameraAbility(cameraIds[0], abilityVec);
104     }
105     if (rc != HDI::Camera::V1_0::NO_ERROR) {
106         CAMERA_LOGE("GetCameraAbility failed, rc = %{public}d", rc);
107     }
108     MetadataUtils::ConvertVecToMetadata(abilityVec, ability);
109 
110     common_metadata_header_t* data = ability->get();
111     camera_metadata_item_t entry;
112     int ret = FindCameraMetadataItem(data, OHOS_CONTROL_AE_AVAILABLE_MODES, &entry);
113     if (ret == 0) {
114         CAMERA_LOGI("get OHOS_CONTROL_AE_AVAILABLE_MODES success");
115     }
116 }
117 
Open(int cameraId)118 void Test::Open(int cameraId)
119 {
120     if (cameraDevice == nullptr) {
121         service->GetCameraIds(cameraIds);
122         if (cameraIds.size() == 0) {
123             CAMERA_LOGE("camera device list empty");
124         }
125         ASSERT_TRUE(cameraIds.size() != 0);
126         GetCameraMetadata(cameraId);
127         deviceCallback = new OHOS::Camera::Test::DemoCameraDeviceCallback();
128 
129         ASSERT_TRUE(serviceV1_1 != nullptr);
130         if (DEVICE_1 == cameraId) {
131             // front camera
132             rc = serviceV1_1->OpenCamera_V1_1(cameraIds[1], deviceCallback, cameraDeviceV1_1);
133         } else {
134             // rear camera
135             rc = serviceV1_1->OpenCamera_V1_1(cameraIds[0], deviceCallback, cameraDeviceV1_1);
136         }
137         if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_1 == nullptr) {
138             CAMERA_LOGE("openCamera V1_1 failed, rc = %{public}d", rc);
139             return;
140         }
141         ASSERT_TRUE(cameraDeviceV1_1 != nullptr);
142         cameraDevice = static_cast<OHOS::HDI::Camera::V1_0::ICameraDevice *>(cameraDeviceV1_1.GetRefPtr());
143         CAMERA_LOGI("OpenCamera V1_1 success");
144     }
145 }
146 
Close()147 void Test::Close()
148 {
149     if (cameraDevice != nullptr) {
150         cameraDevice->Close();
151         cameraDevice = nullptr;
152     }
153 }
154 
StartStream(std::vector<StreamIntent> intents,OHOS::HDI::Camera::V1_1::OperationMode_V1_1 mode)155 void Test::StartStream(std::vector<StreamIntent> intents, OHOS::HDI::Camera::V1_1::OperationMode_V1_1 mode)
156 {
157     (void)mode;
158     StartStream(intents);
159 }
160 
StartStream(std::vector<StreamIntent> intents)161 void Test::StartStream(std::vector<StreamIntent> intents)
162 {
163     streamOperatorCallback = new TestStreamOperatorCallback();
164     uint32_t mainVersion = 1;
165     uint32_t minVersion = 0;
166     rc = cameraDeviceV1_1->GetStreamOperator_V1_1(streamOperatorCallback, streamOperator_V1_1);
167     if (rc == HDI::Camera::V1_0::NO_ERROR) {
168         rc = streamOperator_V1_1->GetVersion(mainVersion, minVersion);
169         streamOperator = static_cast<OHOS::HDI::Camera::V1_0::IStreamOperator *>(streamOperator_V1_1.GetRefPtr());
170         if (rc != HDI::Camera::V1_0::NO_ERROR) {
171             CAMERA_LOGE("StreamOperator V1_1 get version failed, rc = %{public}d", rc);
172         } else {
173             CAMERA_LOGI("StreamOperator V1_1 get version success, %{public}u, %{public}u",
174                 mainVersion, minVersion);
175         }
176         CAMERA_LOGI("GetStreamOperator success");
177     } else {
178         CAMERA_LOGE("GetStreamOperator fail, rc = %{public}d", rc);
179     }
180     streamInfoPre = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
181     streamInfoVideo = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
182     streamInfoCapture = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
183     streamInfoAnalyze = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
184     for (auto& intent : intents) {
185         if (intent == StreamIntent::PREVIEW) {
186             streamInfoPre->v1_0.streamId_ = streamIdPreview;
187             streamInfoPre->v1_0.width_ = previewWidth;
188             streamInfoPre->v1_0.height_ = previewHeight;
189             streamInfoPre->v1_0.format_ = previewFormat;
190             streamInfoPre->v1_0.dataspace_ = UT_DATA_SIZE;
191             streamInfoPre->v1_0.intent_ = intent;
192             streamInfoPre->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
193             std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
194             streamInfoPre->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
195                 DumpImageFile(streamIdPreview, "yuv", addr, size);
196             });
197             streamInfoPre->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
198             consumerMap_[intent] = consumer_pre;
199             streamInfos.push_back(*streamInfoPre);
200         } else if (intent == StreamIntent::VIDEO) {
201             streamInfoVideo->v1_0.streamId_ = streamIdVideo;
202             streamInfoVideo->v1_0.width_ = videoWidth;
203             streamInfoVideo->v1_0.height_ = videoHeight;
204             streamInfoVideo->v1_0.format_ = videoFormat;
205             streamInfoVideo->v1_0.dataspace_ = UT_DATA_SIZE;
206             streamInfoVideo->v1_0.intent_ = intent;
207             streamInfoVideo->v1_0.encodeType_ = ENCODE_TYPE_H265;
208             streamInfoVideo->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
209             std::shared_ptr<StreamConsumer> consumer_video = std::make_shared<StreamConsumer>();
210             streamInfoVideo->v1_0.bufferQueue_ = consumer_video->CreateProducerSeq([this](void* addr, uint32_t size) {
211                 DumpImageFile(streamIdPreview, "yuv", addr, size);
212             });
213             streamInfoVideo->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
214             consumerMap_[intent] = consumer_video;
215             streamInfos.push_back(*streamInfoVideo);
216         } else if (intent == StreamIntent::ANALYZE) {
217             streamInfoAnalyze->v1_0.streamId_ = streamIdAnalyze;
218             streamInfoAnalyze->v1_0.width_ = analyzeWidth;
219             streamInfoAnalyze->v1_0.height_ = analyzeHeight;
220             streamInfoAnalyze->v1_0.format_ = analyzeFormat;
221             streamInfoAnalyze->v1_0.dataspace_ = UT_DATA_SIZE;
222             streamInfoAnalyze->v1_0.intent_ = intent;
223             streamInfoAnalyze->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
224 
225             std::shared_ptr<StreamConsumer> consumer_analyze = std::make_shared<StreamConsumer>();
226             streamInfoAnalyze->v1_0.bufferQueue_ =
227                 consumer_analyze->CreateProducerSeq([this](void* addr, uint32_t size) {
228                 common_metadata_header_t *data = static_cast<common_metadata_header_t *>(addr);
229                 camera_metadata_item_t entry = {};
230 
231                 int ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_IDS, &entry);
232                 if (ret == 0) {
233                     for (size_t i = 0; i < entry.count; i++) {
234                         int id = entry.data.i32[i];
235                         CAMERA_LOGI("Face ids : %{public}d", id);
236                     }
237                 }
238 
239                 ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_RECTANGLES, &entry);
240                 if (ret == 0) {
241                     for (size_t i = 0; i < entry.count; i++) {
242                         int id = entry.data.i32[i];
243                         CAMERA_LOGI("Face rectangles : %{public}d", id);
244                     }
245                 }
246             });
247             streamInfoAnalyze->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
248             consumerMap_[intent] = consumer_analyze;
249             streamInfos.push_back(*streamInfoAnalyze);
250         } else {
251             streamInfoCapture->v1_0.streamId_ = streamIdAnalyze;
252             streamInfoCapture->v1_0.width_ = analyzeWidth;
253             streamInfoCapture->v1_0.height_ = analyzeHeight;
254             streamInfoCapture->v1_0.format_ = analyzeFormat;
255             streamInfoCapture->v1_0.dataspace_ = UT_DATA_SIZE;
256             streamInfoCapture->v1_0.intent_ = intent;
257             streamInfoCapture->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
258             std::shared_ptr<StreamConsumer> consumer_capture = std::make_shared<StreamConsumer>();
259             streamInfoCapture->v1_0.bufferQueue_ =
260                 consumer_capture->CreateProducerSeq([this](void* addr, uint32_t size) {
261                 DumpImageFile(streamIdPreview, "yuv", addr, size);
262             });
263             streamInfoCapture->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
264             consumerMap_[intent] = consumer_capture;
265             streamInfos.push_back(*streamInfoCapture);
266         }
267     }
268 
269     rc = streamOperator_V1_1->CreateStreams_V1_1(streamInfos);
270     EXPECT_EQ(false, rc != HDI::Camera::V1_0::NO_ERROR);
271     rc = streamOperator_V1_1->CommitStreams(OperationMode::NORMAL, abilityVec);
272     EXPECT_EQ(false, rc != HDI::Camera::V1_0::NO_ERROR);
273     sleep(1);
274     std::vector<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>().swap(streamInfos);
275 }
276 
StartCapture(int streamId,int captureId,bool shutterCallback,bool isStreaming)277 void Test::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)
278 {
279     captureInfo = std::make_shared<CaptureInfo>();
280     captureInfo->streamIds_ = {streamId};
281     captureInfo->captureSetting_ = abilityVec;
282     captureInfo->enableShutterCallback_ = shutterCallback;
283     if (streamOperator_V1_1 != nullptr) {
284         rc = (CamRetCode)streamOperator_V1_1->Capture(captureId, *captureInfo, isStreaming);
285     } else {
286         rc = (CamRetCode)streamOperator->Capture(captureId, *captureInfo, isStreaming);
287     }
288     EXPECT_EQ(true, rc == HDI::Camera::V1_0::NO_ERROR);
289     if (rc == HDI::Camera::V1_0::NO_ERROR) {
290         CAMERA_LOGI("check Capture: Capture success, %{public}d", captureId);
291     } else {
292         std::cout << "rc = " << rc << std::endl;
293         CAMERA_LOGE("check Capture: Capture fail, rc = %{public}d", rc);
294     }
295     sleep(UT_SLEEP_TIME);
296 }
297 
StopStream(std::vector<int> & captureIds,std::vector<int> & streamIds)298 void Test::StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds)
299 {
300     if (captureIds.size() > 0) {
301         for (auto &captureId : captureIds) {
302             if (streamOperator_V1_1 != nullptr) {
303                 rc = streamOperator_V1_1->CancelCapture(captureId);
304             } else {
305                 rc = streamOperator->CancelCapture(captureId);
306             }
307             EXPECT_EQ(true, rc == HDI::Camera::V1_0::NO_ERROR);
308             if (rc == HDI::Camera::V1_0::NO_ERROR) {
309                 CAMERA_LOGI("check Capture: CancelCapture success, %{public}d", captureId);
310             } else {
311                 CAMERA_LOGE("check Capture: CancelCapture fail, rc = %{public}d, captureId = %{public}d",
312                     rc, captureId);
313             }
314         }
315     }
316     if (streamIds.size() > 0) {
317         if (streamOperator_V1_1 != nullptr) {
318             rc = streamOperator_V1_1->ReleaseStreams(streamIds);
319         } else {
320             rc = streamOperator->ReleaseStreams(streamIds);
321         }
322         EXPECT_EQ(true, rc == HDI::Camera::V1_0::NO_ERROR);
323         if (rc == HDI::Camera::V1_0::NO_ERROR) {
324             CAMERA_LOGI("check Capture: ReleaseStream success");
325         } else {
326             CAMERA_LOGE("check Capture: ReleaseStreams fail, rc = %{public}d", rc);
327         }
328     }
329 }
330 
CalculateFps(int64_t timestamp,int32_t streamId)331 void Test::StreamConsumer::CalculateFps(int64_t timestamp, int32_t streamId)
332 {
333     if (isFirstCalculateFps_) {
334         if ((timestamp - intervalTimestamp_) >= interval_) {
335             int64_t timeInterval = timestamp - intervalTimestamp_;
336             if (timeInterval != 0) {
337                 float fps = (int64_t)(100000000000 * timestampCount_ / timeInterval) / 100.0;
338                 CAMERA_LOGI("Calculate FPS success, streamId: %{public}d, Fps:%{public}f", streamId, fps);
339                 interval_ = ONESECOND_OF_MICROSECOND_UNIT;
340             } else {
341                 CAMERA_LOGE("Calculate FPS error timeInerval is 0");
342             }
343         }
344     } else {
345         intervalTimestamp_ = timestamp;
346         isFirstCalculateFps_ = true;
347     }
348     if ((timestamp - intervalTimestamp_) >= ONESECOND_OF_MICROSECOND_UNIT * UT_SECOND_TIMES) {
349         intervalTimestamp_ = timestamp;
350         timestampCount_ = 0;
351         interval_ = ONESECOND_OF_MICROSECOND_UNIT;
352     }
353     timestampCount_++;
354 }
355 
CreateProducer(std::function<void (void *,uint32_t)> callback)356 OHOS::sptr<OHOS::IBufferProducer> Test::StreamConsumer::CreateProducer(std::function<void(void*, uint32_t)> callback)
357 {
358     consumer_ = OHOS::IConsumerSurface::Create();
359     if (consumer_ == nullptr) {
360         return nullptr;
361     }
362     sptr<IBufferConsumerListener> listener = new TestBufferConsumerListener();
363     consumer_->RegisterConsumerListener(listener);
364     auto producer = consumer_->GetProducer();
365     if (producer == nullptr) {
366         return nullptr;
367     }
368 
369     callback_ = callback;
370     consumerThread_ = new std::thread([this, listener] {
371         int32_t flushFence = 0;
372         int64_t timestamp = 0;
373         OHOS::Rect damage;
374         TestBufferConsumerListener* checker = static_cast<TestBufferConsumerListener*>(listener.GetRefPtr());
375         while (running_ == true) {
376             OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr;
377             if (checker->checkBufferAvailable()) {
378                 consumer_->AcquireBuffer(buffer, flushFence, timestamp, damage);
379                 if (buffer != nullptr) {
380                     void* addr = buffer->GetVirAddr();
381                     uint32_t size = buffer->GetSize();
382 
383                     int32_t gotSize = 0;
384                     int32_t isKey = 0;
385                     int32_t streamId = 0;
386                     int32_t captureId = 0;
387                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::dataSize, gotSize);
388                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::isKeyFrame, isKey);
389                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::timeStamp, timestamp);
390                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::streamId, streamId);
391                     buffer->GetExtraData()->ExtraGet(OHOS::Camera::captureId, captureId);
392                     if (gotSize) {
393                         CalculateFps(timestamp, streamId);
394                         callback_(addr, gotSize);
395                     } else {
396                         callback_(addr, size);
397                     }
398 
399                     consumer_->ReleaseBuffer(buffer, -1);
400                     shotCount_--;
401                     if (shotCount_ == 0) {
402                         std::unique_lock<std::mutex> l(l_);
403                         cv_.notify_one();
404                     }
405                 }
406             }
407             if (running_ == false) {
408                 break;
409             }
410             usleep(1);
411         }
412     });
413 
414     return producer;
415 }
416 
CreateProducerSeq(std::function<void (void *,uint32_t)> callback)417 OHOS::sptr<BufferProducerSequenceable> Test::StreamConsumer::CreateProducerSeq(
418     std::function<void(void*, uint32_t)> callback)
419 {
420     OHOS::sptr<OHOS::IBufferProducer> producer = CreateProducer(callback);
421     if (producer == nullptr) {
422         return nullptr;
423     }
424 
425     return new BufferProducerSequenceable(producer);
426 }
427 
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamId)428 int32_t Test::TestStreamOperatorCallback::OnCaptureStarted(int32_t captureId, const std::vector<int32_t> &streamId)
429 {
430     for (auto it : streamId) {
431         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
432     }
433     return HDI::Camera::V1_0::NO_ERROR;
434 }
435 
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)436 int32_t Test::TestStreamOperatorCallback::OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo> &infos)
437 {
438     for (auto it : infos) {
439         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_,
440             it.frameCount_);
441     }
442     return HDI::Camera::V1_0::NO_ERROR;
443 }
444 
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)445 int32_t Test::TestStreamOperatorCallback::OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo> &infos)
446 {
447     for (auto it : infos) {
448         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_,
449             it.error_);
450     }
451     return HDI::Camera::V1_0::NO_ERROR;
452 }
453 
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)454 int32_t Test::TestStreamOperatorCallback::OnFrameShutter(int32_t captureId,
455     const std::vector<int32_t> &streamIds, uint64_t timestamp)
456 {
457     (void)timestamp;
458     for (auto it : streamIds) {
459         CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
460     }
461     return HDI::Camera::V1_0::NO_ERROR;
462 }
463 
OnError(ErrorType type,int32_t errorMsg)464 int32_t Test::DemoCameraDeviceCallback::OnError(ErrorType type, int32_t errorMsg)
465 {
466     CAMERA_LOGE("type: %{public}d, errorMsg: %{public}d", type, errorMsg);
467     return HDI::Camera::V1_0::NO_ERROR;
468 }
469 
OnResult(uint64_t timestamp,const std::vector<uint8_t> & result)470 int32_t Test::DemoCameraDeviceCallback::OnResult(uint64_t timestamp, const std::vector<uint8_t> &result)
471 {
472     if (Test::resultCallback_) {
473         std::shared_ptr<CameraMetadata> resultMeta;
474         MetadataUtils::ConvertVecToMetadata(result, resultMeta);
475         Test::resultCallback_(timestamp, resultMeta);
476     }
477     return HDI::Camera::V1_0::NO_ERROR;
478 }
479 
OnCameraStatus(const std::string & cameraId,CameraStatus status)480 int32_t Test::TestCameraHostCallback::OnCameraStatus(const std::string& cameraId, CameraStatus status)
481 {
482     CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
483     return HDI::Camera::V1_0::NO_ERROR;
484 }
485 
OnFlashlightStatus(const std::string & cameraId,FlashlightStatus status)486 int32_t Test::TestCameraHostCallback::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status)
487 {
488     CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
489     return HDI::Camera::V1_0::NO_ERROR;
490 }
491 
OnCameraEvent(const std::string & cameraId,CameraEvent event)492 int32_t Test::TestCameraHostCallback::OnCameraEvent(const std::string& cameraId, CameraEvent event)
493 {
494     CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), event);
495     return HDI::Camera::V1_0::NO_ERROR;
496 }
497 
498 }
499