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