1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except 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 "dcamera_hdf_demo.h"
17 
18 #include "distributed_hardware_log.h"
19 #include "metadata_utils.h"
20 
21 namespace OHOS {
22 namespace DistributedHardware {
DcameraHdfDemo()23 DcameraHdfDemo::DcameraHdfDemo() {}
~DcameraHdfDemo()24 DcameraHdfDemo::~DcameraHdfDemo() {}
25 
26 std::vector<int32_t> results_list_;
27 
28 const int32_t METER_POINT_X = 305;
29 const int32_t METER_POINT_Y = 205;
30 const int32_t AF_REGIONS_X = 400;
31 const int32_t AF_REGIONS_Y = 200;
32 const int32_t FPS_RANGE = 30;
33 
SetStreamInfo(StreamInfo & streamInfo,const std::shared_ptr<StreamCustomer> & streamCustomer,const int streamId,const StreamIntent intent)34 void DcameraHdfDemo::SetStreamInfo(StreamInfo& streamInfo,
35     const std::shared_ptr<StreamCustomer> &streamCustomer,
36     const int streamId, const StreamIntent intent)
37 {
38     constexpr uint32_t dataspace = 8;
39     constexpr uint32_t tunneledMode = 5;
40     sptr<OHOS::IBufferProducer> producer;
41 
42     if (intent == OHOS::HDI::Camera::V1_0::PREVIEW) {
43         constexpr uint32_t width = CAMERA_PREVIEW_WIDTH;
44         constexpr uint32_t height = CAMERA_PREVIEW_HEIGHT;
45         streamInfo.width_ = width;
46         streamInfo.height_ = height;
47         producer = streamCustomer->CreateProducer(CAPTURE_PREVIEW, nullptr);
48     } else if (intent == OHOS::HDI::Camera::V1_0::STILL_CAPTURE) {
49         constexpr uint32_t width = CAMERA_CAPTURE_WIDTH;
50         constexpr uint32_t height = CAMERA_CAPTURE_HEIGHT;
51         streamInfo.width_ = width;
52         streamInfo.height_ = height;
53         streamInfo.encodeType_ = CAMERA_CAPTURE_ENCODE_TYPE;
54         producer = streamCustomer->CreateProducer(CAPTURE_SNAPSHOT, [this](void* addr, const uint32_t size) {
55             StoreImage(addr, size);
56         });
57     } else {
58         constexpr uint32_t width = CAMERA_VIDEO_WIDTH;
59         constexpr uint32_t height = CAMERA_VIDEO_HEIGHT;
60         streamInfo.width_ = width;
61         streamInfo.height_ = height;
62         streamInfo.encodeType_ = CAMERA_VIDEO_ENCODE_TYPE;
63         OpenVideoFile();
64         producer = streamCustomer->CreateProducer(CAPTURE_VIDEO, [this](void* addr, const uint32_t size) {
65             StoreVideo(addr, size);
66         });
67     }
68 
69     streamInfo.streamId_ = streamId;
70     streamInfo.format_ = CAMERA_FORMAT;
71     streamInfo.dataspace_ = dataspace;
72     streamInfo.intent_ = intent;
73     streamInfo.tunneledMode_ = tunneledMode;
74 
75     streamInfo.bufferQueue_ = sptr<BufferProducerSequenceable>(new BufferProducerSequenceable(producer));
76     streamInfo.bufferQueue_->producer_->SetQueueSize(8); // 8:set bufferQueue size
77 }
78 
GetStreamOpt()79 void DcameraHdfDemo::GetStreamOpt()
80 {
81     int rc = 0;
82 
83     if (streamOperator_ == nullptr) {
84         const sptr<IStreamOperatorCallback> streamOperatorCallback(new DemoStreamOperatorCallback());
85         rc = demoCameraDevice_->GetStreamOperator(streamOperatorCallback, streamOperator_);
86         if (rc != HDI::Camera::V1_0::NO_ERROR) {
87             DHLOGE("demo test: GetStreamOpt GetStreamOperator fail");
88             streamOperator_ = nullptr;
89         }
90     }
91 }
92 
CaptureON(const int streamId,const int captureId,CaptureMode mode)93 RetCode DcameraHdfDemo::CaptureON(const int streamId,
94     const int captureId, CaptureMode mode)
95 {
96     DHLOGI("demo test: CaptureON enter streamId == %{public}d and captureId == %{public}d and mode == %{public}d",
97         streamId, captureId, mode);
98     std::lock_guard<std::mutex> l(metaDatalock_);
99     if (mode == CAPTURE_SNAPSHOT) {
100         constexpr double latitude = 27.987500; // dummy data: Qomolangma latitde
101         constexpr double longitude = 86.927500; // dummy data: Qomolangma longituude
102         constexpr double altitude = 8848.86; // dummy data: Qomolangma altitude
103         constexpr size_t entryCapacity = 100;
104         constexpr size_t dataCapacity = 2000;
105         captureSetting_ = std::make_shared<CameraSetting>(entryCapacity, dataCapacity);
106         captureQuality_ = OHOS_CAMERA_JPEG_LEVEL_HIGH;
107         captureOrientation_ = OHOS_CAMERA_JPEG_ROTATION_270;
108         mirrorSwitch_ = OHOS_CAMERA_MIRROR_ON;
109         gps_.push_back(latitude);
110         gps_.push_back(longitude);
111         gps_.push_back(altitude);
112         captureSetting_->addEntry(OHOS_JPEG_QUALITY, static_cast<void*>(&captureQuality_),
113             sizeof(captureQuality_));
114         captureSetting_->addEntry(OHOS_JPEG_ORIENTATION, static_cast<void*>(&captureOrientation_),
115             sizeof(captureOrientation_));
116         captureSetting_->addEntry(OHOS_CONTROL_CAPTURE_MIRROR, static_cast<void*>(&mirrorSwitch_),
117             sizeof(mirrorSwitch_));
118         captureSetting_->addEntry(OHOS_JPEG_GPS_COORDINATES, gps_.data(), gps_.size());
119     }
120 
121     std::vector<uint8_t> setting;
122     bool iscapture = true;
123     OHOS::Camera::MetadataUtils::ConvertMetadataToVec(captureSetting_, setting);
124     captureInfo_.streamIds_ = {streamId};
125     if (mode == CAPTURE_SNAPSHOT) {
126         captureInfo_.captureSetting_ = setting;
127         iscapture = false;
128     } else {
129         captureInfo_.captureSetting_ = cameraAbility_;
130         iscapture = true;
131     }
132     captureInfo_.enableShutterCallback_ = false;
133     int rc = streamOperator_->Capture(captureId, captureInfo_, iscapture);
134     if (rc != HDI::Camera::V1_0::NO_ERROR) {
135         DHLOGE("demo test: CaptureStart Capture error");
136         streamOperator_->ReleaseStreams(captureInfo_.streamIds_);
137         return RC_ERROR;
138     }
139     DHLOGI("demo test: CaptureON exit");
140 
141     return RC_OK;
142 }
143 
CaptureOff(const int captureId,const CaptureMode mode)144 RetCode DcameraHdfDemo::CaptureOff(const int captureId, const CaptureMode mode)
145 {
146     int rc = 0;
147     DHLOGI("demo test: CaptureOff enter mode == %{public}d", mode);
148 
149     if (streamOperator_ == nullptr) {
150         DHLOGE("demo test: CaptureOff streamOperator_ is nullptr");
151         return RC_ERROR;
152     }
153 
154     if (mode == CAPTURE_PREVIEW) {
155         rc = streamOperator_->CancelCapture(captureId);
156     } else if (mode == CAPTURE_SNAPSHOT) {
157         rc = streamOperator_->CancelCapture(captureId);
158     } else if (mode == CAPTURE_VIDEO) {
159         rc = streamOperator_->CancelCapture(captureId);
160         close(videoFd_);
161         videoFd_ = -1;
162     }
163 
164     if (rc != HDI::Camera::V1_0::NO_ERROR) {
165         DHLOGE("demo test: CaptureOff CancelCapture error mode %{public}d rc == %{public}d", mode, rc);
166         return RC_ERROR;
167     }
168     DHLOGI("demo test: CaptureOff exit");
169 
170     return RC_OK;
171 }
172 
CreateStreamInfo(const int streamId,std::shared_ptr<StreamCustomer> & streamCustomer,StreamIntent intent)173 RetCode DcameraHdfDemo::CreateStreamInfo(const int streamId, std::shared_ptr<StreamCustomer> &streamCustomer,
174     StreamIntent intent)
175 {
176     DHLOGI("demo test: CreateStream enter");
177     GetStreamOpt();
178     if (streamOperator_ == nullptr) {
179         DHLOGE("demo test: CreateStream GetStreamOpt() is nullptr");
180         return RC_ERROR;
181     }
182 
183     StreamInfo streamInfo = {0};
184 
185     SetStreamInfo(streamInfo, streamCustomer, streamId, intent);
186     if (streamInfo.bufferQueue_->producer_ == nullptr) {
187         DHLOGE("demo test: CreateStream CreateProducer(); is nullptr");
188         return RC_ERROR;
189     }
190     streamInfos_.push_back(streamInfo);
191     streamIds_.push_back(streamId);
192     return RC_OK;
193 }
194 
CreateStream()195 RetCode DcameraHdfDemo::CreateStream()
196 {
197     int rc = 0;
198     DHLOGI("demo test: CreateStreams start");
199     rc = streamOperator_->CreateStreams(streamInfos_);
200     if (rc != HDI::Camera::V1_0::NO_ERROR) {
201         DHLOGE("demo test: CreateStream CreateStreams error");
202         return RC_ERROR;
203     }
204     DHLOGI("demo test: CommitStreams start");
205     rc = streamOperator_->CommitStreams(NORMAL, cameraAbility_);
206     if (rc != HDI::Camera::V1_0::NO_ERROR) {
207         DHLOGE("demo test: CreateStream CommitStreams error");
208         streamOperator_->ReleaseStreams(streamIds_);
209         return RC_ERROR;
210     }
211 
212     DHLOGI("demo test: CreateStream exit");
213 
214     return RC_OK;
215 }
216 
InitCameraDevice()217 RetCode DcameraHdfDemo::InitCameraDevice()
218 {
219     int rc = 0;
220 
221     DHLOGI("demo test: InitCameraDevice enter");
222 
223     if (demoCameraHost_ == nullptr) {
224         DHLOGE("demo test: InitCameraDevice demoCameraHost_ == nullptr");
225         return RC_ERROR;
226     }
227 
228     (void)demoCameraHost_->GetCameraIds(cameraIds_);
229     if (cameraIds_.empty()) {
230         return RC_ERROR;
231     }
232 
233     const std::string cameraId = cameraIds_.front();
234     demoCameraHost_->GetCameraAbility(cameraId, cameraAbility_);
235 
236     OHOS::Camera::MetadataUtils::ConvertVecToMetadata(cameraAbility_, ability_);
237 
238     GetFaceDetectMode(ability_);
239     GetFocalLength(ability_);
240     GetAvailableFocusModes(ability_);
241     GetAvailableExposureModes(ability_);
242     GetExposureCompensationRange(ability_);
243     GetExposureCompensationSteps(ability_);
244     GetAvailableMeterModes(ability_);
245     GetAvailableFlashModes(ability_);
246     GetMirrorSupported(ability_);
247     GetStreamBasicConfigurations(ability_);
248     GetFpsRange(ability_);
249     GetCameraPosition(ability_);
250     GetCameraType(ability_);
251     GetCameraConnectionType(ability_);
252     GetFaceDetectMaxNum(ability_);
253 
254     sptr<DemoCameraDeviceCallback> callback(new DemoCameraDeviceCallback());
255     rc = demoCameraHost_->OpenCamera(cameraIds_.front(), callback, demoCameraDevice_);
256     if (rc != HDI::Camera::V1_0::NO_ERROR || demoCameraDevice_ == nullptr) {
257         DHLOGE("demo test: InitCameraDevice OpenCamera failed");
258         return RC_ERROR;
259     }
260 
261     DHLOGI("demo test: InitCameraDevice exit");
262 
263     return RC_OK;
264 }
265 
ReleaseCameraDevice()266 void DcameraHdfDemo::ReleaseCameraDevice()
267 {
268     if (demoCameraDevice_ != nullptr) {
269         DHLOGI("demo test: ReleaseCameraDevice close Device");
270         demoCameraDevice_->Close();
271         demoCameraDevice_ = nullptr;
272     }
273 }
274 
InitSensors()275 RetCode DcameraHdfDemo::InitSensors()
276 {
277     int rc = 0;
278     DHLOGI("demo test: InitSensors enter");
279     if (demoCameraHost_ != nullptr) {
280         return RC_OK;
281     }
282 
283     constexpr const char *demoServiceName = "distributed_camera_service";
284     demoCameraHost_ = ICameraHost::Get(demoServiceName, false);
285     if (demoCameraHost_ == nullptr) {
286         DHLOGE("demo test: ICameraHost::Get error");
287         return RC_ERROR;
288     }
289 
290     hostCallback_ = sptr<DemoCameraHostCallback>(new DemoCameraHostCallback());
291     rc = demoCameraHost_->SetCallback(hostCallback_);
292     if (rc != HDI::Camera::V1_0::NO_ERROR) {
293         DHLOGE("demo test: demoCameraHost_->SetCallback(hostCallback_) error");
294         return RC_ERROR;
295     }
296 
297     DHLOGI("demo test: InitSensors exit");
298 
299     return RC_OK;
300 }
301 
StoreImage(const void * bufStart,const uint32_t size) const302 void DcameraHdfDemo::StoreImage(const void *bufStart, const uint32_t size) const
303 {
304     DHLOGI("demo test:StoreImage size == %{public}d", size);
305     constexpr uint32_t pathLen = 64;
306     char path[pathLen] = {0};
307     char prefix[] = "/data/";
308 
309     int imgFD = 0;
310     int ret;
311     struct timeval start = {};
312     gettimeofday(&start, nullptr);
313     if (sprintf_s(path, sizeof(path), "%spicture_%ld.jpeg", prefix, start.tv_usec) < 0) {
314         DHLOGE("sprintf_s error .....");
315         return;
316     }
317 
318     imgFD = open(path, O_RDWR | O_CREAT, 00766); // 00766:file operate permission
319     if (imgFD == -1) {
320         DHLOGE("demo test:open image file error %{public}s.....", strerror(errno));
321         return;
322     }
323 
324     ret = write(imgFD, bufStart, size);
325     if (ret == -1) {
326         DHLOGE("demo test:write image file error %{public}s.....", strerror(errno));
327     }
328 
329     close(imgFD);
330     DHLOGI("demo test:StoreImage save success");
331 }
332 
StoreVideo(const void * bufStart,const uint32_t size) const333 void DcameraHdfDemo::StoreVideo(const void *bufStart, const uint32_t size) const
334 {
335     int ret = 0;
336 
337     ret = write(videoFd_, bufStart, size);
338     if (ret == -1) {
339         DHLOGE("demo test:write video file error %{public}s.....", strerror(errno));
340     }
341     DHLOGI("demo test:StoreVideo size == %{public}d", size);
342 }
343 
OpenVideoFile()344 void DcameraHdfDemo::OpenVideoFile()
345 {
346     constexpr uint32_t pathLen = 64;
347     char path[pathLen] = {0};
348     char prefix[] = "/data/";
349     auto seconds = time(nullptr);
350     if (sprintf_s(path, sizeof(path), "%svideo%ld.h264", prefix, seconds) < 0) {
351         DHLOGE("%{public}s: sprintf  failed", __func__);
352         return;
353     }
354     videoFd_ = open(path, O_RDWR | O_CREAT, 00766); // 00766:file operate permission
355     if (videoFd_ < 0) {
356         DHLOGE("demo test: StartVideo open %{public}s %{public}s failed", path, strerror(errno));
357     }
358 }
359 
CreateStreams(const int streamIdSecond,StreamIntent intent)360 RetCode DcameraHdfDemo::CreateStreams(const int streamIdSecond, StreamIntent intent)
361 {
362     int rc = 0;
363     std::vector<StreamInfo> streamInfos;
364     std::vector<StreamInfo>().swap(streamInfos);
365 
366     DHLOGI("demo test: CreateStreams streamIdSecond = %{public}d", streamIdSecond);
367     GetStreamOpt();
368     if (streamOperator_ == nullptr) {
369         DHLOGE("demo test: CreateStreams GetStreamOpt() is nullptr");
370         return RC_ERROR;
371     }
372 
373     StreamInfo previewStreamInfo = {0};
374 
375     SetStreamInfo(previewStreamInfo, streamCustomerPreview_, STREAM_ID_PREVIEW, OHOS::HDI::Camera::V1_0::PREVIEW);
376     if (previewStreamInfo.bufferQueue_->producer_ == nullptr) {
377         DHLOGE("demo test: CreateStream CreateProducer(); is nullptr");
378         return RC_ERROR;
379     }
380     streamInfos.push_back(previewStreamInfo);
381 
382     StreamInfo secondStreamInfo = {0};
383 
384     if (streamIdSecond == STREAM_ID_CAPTURE) {
385         SetStreamInfo(secondStreamInfo, streamCustomerCapture_, STREAM_ID_CAPTURE, intent);
386     } else {
387         SetStreamInfo(secondStreamInfo, streamCustomerVideo_, STREAM_ID_VIDEO, intent);
388     }
389 
390     if (secondStreamInfo.bufferQueue_->producer_ == nullptr) {
391         DHLOGE("demo test: CreateStreams CreateProducer() secondStreamInfo is nullptr");
392         return RC_ERROR;
393     }
394     streamInfos.push_back(secondStreamInfo);
395 
396     rc = streamOperator_->CreateStreams(streamInfos);
397     if (rc != HDI::Camera::V1_0::NO_ERROR) {
398         DHLOGE("demo test: CreateStream CreateStreams error");
399         return RC_ERROR;
400     }
401 
402     rc = streamOperator_->CommitStreams(NORMAL, cameraAbility_);
403     if (rc != HDI::Camera::V1_0::NO_ERROR) {
404         DHLOGE("demo test: CreateStream CommitStreams error");
405         std::vector<int> streamIds = {STREAM_ID_PREVIEW, streamIdSecond};
406         streamOperator_->ReleaseStreams(streamIds);
407         return RC_ERROR;
408     }
409 
410     return RC_OK;
411 }
412 
CaptureOnDualStreams(const int streamIdSecond)413 RetCode DcameraHdfDemo::CaptureOnDualStreams(const int streamIdSecond)
414 {
415     int rc = 0;
416     DHLOGI("demo test: CaptuCaptureOnDualStreamsreON enter");
417 
418     CaptureInfo previewCaptureInfo;
419     previewCaptureInfo.streamIds_ = {STREAM_ID_PREVIEW};
420     previewCaptureInfo.captureSetting_ = cameraAbility_;
421     previewCaptureInfo.enableShutterCallback_ = false;
422 
423     rc = streamOperator_->Capture(CAPTURE_ID_PREVIEW, previewCaptureInfo, true);
424     if (rc != HDI::Camera::V1_0::NO_ERROR) {
425         DHLOGE("demo test: CaptureOnDualStreams preview Capture error");
426         streamOperator_->ReleaseStreams(previewCaptureInfo.streamIds_);
427         return RC_ERROR;
428     }
429 
430     CaptureInfo secondCaptureInfo;
431     secondCaptureInfo.streamIds_ = {streamIdSecond};
432     secondCaptureInfo.captureSetting_ = cameraAbility_;
433     previewCaptureInfo.enableShutterCallback_ = false;
434 
435     if (streamIdSecond == STREAM_ID_CAPTURE) {
436         rc = streamOperator_->Capture(CAPTURE_ID_CAPTURE, secondCaptureInfo, true);
437         if (rc != HDI::Camera::V1_0::NO_ERROR) {
438             DHLOGE("demo test: CaptureOnDualStreams CAPTURE_ID_CAPTURE error");
439             streamOperator_->ReleaseStreams(secondCaptureInfo.streamIds_);
440             return RC_ERROR;
441         }
442     } else {
443         rc = streamOperator_->Capture(CAPTURE_ID_VIDEO, secondCaptureInfo, true);
444         if (rc != HDI::Camera::V1_0::NO_ERROR) {
445             DHLOGE("demo test: CaptureOnDualStreams CAPTURE_ID_VIDEO error");
446             streamOperator_->ReleaseStreams(secondCaptureInfo.streamIds_);
447             return RC_ERROR;
448         }
449     }
450 
451     DHLOGI("demo test: CaptuCaptureOnDualStreamsreON exit");
452 
453     return RC_OK;
454 }
455 
StartDualStreams(const int streamIdSecond)456 RetCode DcameraHdfDemo::StartDualStreams(const int streamIdSecond)
457 {
458     RetCode rc = RC_OK;
459 
460     DHLOGI("demo test: StartDualStreams enter");
461 
462     if (streamCustomerPreview_ == nullptr) {
463         streamCustomerPreview_ = std::make_shared<StreamCustomer>();
464     }
465     if (isPreviewOn_ != 0) {
466         return RC_OK;
467     }
468     isPreviewOn_ = 1;
469     if (streamIdSecond == STREAM_ID_CAPTURE) {
470         if (streamCustomerCapture_ == nullptr) {
471             streamCustomerCapture_ = std::make_shared<StreamCustomer>();
472         }
473 
474         if (isCaptureOn_ == 0) {
475             isCaptureOn_ = 1;
476             rc = CreateStreams(streamIdSecond, OHOS::HDI::Camera::V1_0::STILL_CAPTURE);
477             if (rc != RC_OK) {
478                 DHLOGE("demo test:StartPreviewStream CreateStreams error");
479                 return RC_ERROR;
480             }
481         }
482     } else {
483         if (streamCustomerVideo_ == nullptr) {
484             streamCustomerVideo_ = std::make_shared<StreamCustomer>();
485         }
486 
487         if (isVideoOn_ == 0) {
488             isVideoOn_ = 1;
489             rc = CreateStreams(streamIdSecond, OHOS::HDI::Camera::V1_0::VIDEO);
490             if (rc != RC_OK) {
491                 DHLOGE("demo test:StartPreviewStream CreateStreams error");
492                 return RC_ERROR;
493             }
494         }
495     }
496 
497     DHLOGI("demo test: StartDualStreams exit");
498 
499     return RC_OK;
500 }
501 
StartCaptureStream()502 RetCode DcameraHdfDemo::StartCaptureStream()
503 {
504     RetCode rc = RC_OK;
505 
506     DHLOGI("demo test: StartCaptureStream enter");
507     if (streamCustomerCapture_ == nullptr) {
508         streamCustomerCapture_ = std::make_shared<StreamCustomer>();
509     }
510 
511     if (isCaptureOn_ == 0) {
512         isCaptureOn_ = 1;
513 
514         rc = CreateStreamInfo(STREAM_ID_CAPTURE, streamCustomerCapture_, OHOS::HDI::Camera::V1_0::STILL_CAPTURE);
515         if (rc != RC_OK) {
516             DHLOGE("demo test:StartCaptureStream CreateStream error");
517             return RC_ERROR;
518         }
519     }
520 
521     DHLOGI("demo test: StartCaptureStream exit");
522 
523     return RC_OK;
524 }
525 
StartVideoStream()526 RetCode DcameraHdfDemo::StartVideoStream()
527 {
528     RetCode rc = RC_OK;
529 
530     DHLOGI("demo test: StartVideoStream enter");
531     if (streamCustomerVideo_ == nullptr) {
532         streamCustomerVideo_ = std::make_shared<StreamCustomer>();
533     }
534 
535     if (isVideoOn_ == 0) {
536         isVideoOn_ = 1;
537 
538         rc = CreateStreamInfo(STREAM_ID_VIDEO, streamCustomerVideo_, OHOS::HDI::Camera::V1_0::VIDEO);
539         if (rc != RC_OK) {
540             DHLOGE("demo test:StartVideoStream CreateStream error");
541             return RC_ERROR;
542         }
543     }
544 
545     DHLOGI("demo test: StartVideoStream exit");
546 
547     return RC_OK;
548 }
549 
StartPreviewStream()550 RetCode DcameraHdfDemo::StartPreviewStream()
551 {
552     RetCode rc = RC_OK;
553 
554     DHLOGI("demo test: StartPreviewStream enter");
555 
556     if (streamCustomerPreview_ == nullptr) {
557         streamCustomerPreview_ = std::make_shared<StreamCustomer>();
558     }
559 
560     if (isPreviewOn_ == 0) {
561         isPreviewOn_ = 1;
562 
563         rc = CreateStreamInfo(STREAM_ID_PREVIEW, streamCustomerPreview_, OHOS::HDI::Camera::V1_0::PREVIEW);
564         if (rc != RC_OK) {
565             DHLOGE("demo test:StartPreviewStream CreateStream error");
566             return RC_ERROR;
567         }
568     }
569 
570     DHLOGI("demo test: StartPreviewStream exit");
571 
572     return RC_OK;
573 }
574 
ReleaseAllStream()575 RetCode DcameraHdfDemo::ReleaseAllStream()
576 {
577     std::vector<int> streamIds;
578 
579     DHLOGI("demo test: ReleaseAllStream enter");
580 
581     if (isPreviewOn_ != 1) {
582         DHLOGE("demo test: ReleaseAllStream preview is not running");
583         return RC_ERROR;
584     }
585 
586     if (isCaptureOn_ == 1) {
587         DHLOGI("demo test: ReleaseAllStream STREAM_ID_PREVIEW STREAM_ID_CAPTURE");
588         streamIds = {STREAM_ID_PREVIEW, STREAM_ID_CAPTURE};
589         streamOperator_->ReleaseStreams(streamIds);
590     } else {
591         DHLOGI("demo test: ReleaseAllStream STREAM_ID_PREVIEW STREAM_ID_VIDEO");
592         streamIds = {STREAM_ID_PREVIEW, STREAM_ID_VIDEO};
593         streamOperator_->ReleaseStreams(streamIds);
594     }
595 
596     streamInfos_.clear();
597     streamIds_.clear();
598 
599     isPreviewOn_ = 0;
600     isCaptureOn_ = 0;
601     isVideoOn_ = 0;
602 
603     DHLOGI("demo test: ReleaseAllStream exit");
604 
605     return RC_OK;
606 }
607 
QuitDemo()608 void DcameraHdfDemo::QuitDemo()
609 {
610     ReleaseCameraDevice();
611     DHLOGI("demo test: QuitDemo done");
612 }
613 
SetEnableResult()614 void DcameraHdfDemo::SetEnableResult()
615 {
616     DHLOGI("demo test: SetEnableResult enter");
617 
618     results_list_.push_back(OHOS_CONTROL_EXPOSURE_MODE);
619     results_list_.push_back(OHOS_CONTROL_FOCUS_MODE);
620     demoCameraDevice_->EnableResult(results_list_);
621 
622     DHLOGI("demo test: SetEnableResult exit");
623 }
624 
SetAwbMode(const int mode) const625 void DcameraHdfDemo::SetAwbMode(const int mode) const
626 {
627     DHLOGI("demo test: SetAwbMode enter");
628 
629     constexpr size_t entryCapacity = 100;
630     constexpr size_t dataCapacity = 2000;
631 
632     std::shared_ptr<CameraSetting> metaData = std::make_shared<CameraSetting>(entryCapacity, dataCapacity);
633     std::vector<uint8_t> result;
634 
635     const uint8_t awbMode = mode;
636     metaData->addEntry(OHOS_CONTROL_AWB_MODE, &awbMode, 1);
637     OHOS::Camera::MetadataUtils::ConvertMetadataToVec(metaData, result);
638     demoCameraDevice_->UpdateSettings(result);
639 
640     DHLOGI("demo test: SetAwbMode exit");
641 }
642 
SetAeExpo()643 void DcameraHdfDemo::SetAeExpo()
644 {
645     int32_t expo;
646 
647     DHLOGI("demo test: SetAeExpo enter");
648 
649     constexpr size_t entryCapacity = 100;
650     constexpr size_t dataCapacity = 2000;
651 
652     std::shared_ptr<CameraSetting> metaData = std::make_shared<CameraSetting>(entryCapacity, dataCapacity);
653     std::vector<uint8_t> result;
654 
655     if (aeStatus_) {
656         expo = 0xa0;
657     } else {
658         expo = 0x30;
659     }
660     aeStatus_ = !aeStatus_;
661     metaData->addEntry(OHOS_CONTROL_AE_EXPOSURE_COMPENSATION, &expo, 1);
662     OHOS::Camera::MetadataUtils::ConvertMetadataToVec(metaData, result);
663     demoCameraDevice_->UpdateSettings(result);
664 
665     DHLOGI("demo test: SetAeExpo exit");
666 }
667 
SetMetadata()668 void DcameraHdfDemo::SetMetadata()
669 {
670     DHLOGI("demo test: SetMetadata enter");
671     constexpr size_t entryCapacity = 100;
672     constexpr size_t dataCapacity = 2000;
673     std::shared_ptr<CameraSetting> metaData = std::make_shared<CameraSetting>(entryCapacity, dataCapacity);
674     SetAwbMode(OHOS_CAMERA_AWB_MODE_INCANDESCENT);
675 
676     uint8_t aeMode = OHOS_CAMERA_EXPOSURE_MODE_CONTINUOUS_AUTO;
677     metaData->addEntry(OHOS_CONTROL_EXPOSURE_MODE, &aeMode, sizeof(aeMode));
678 
679     int64_t exposureTime = 400;
680     metaData->addEntry(OHOS_SENSOR_EXPOSURE_TIME, &exposureTime, sizeof(exposureTime));
681 
682     int32_t aeExposureCompensation = 4;
683     metaData->addEntry(OHOS_CONTROL_AE_EXPOSURE_COMPENSATION, &aeExposureCompensation, sizeof(aeExposureCompensation));
684 
685     std::vector<int32_t> meterPoint;
686     meterPoint.push_back(METER_POINT_X);
687     meterPoint.push_back(METER_POINT_Y);
688     metaData->addEntry(OHOS_CONTROL_METER_POINT, meterPoint.data(), meterPoint.size());
689 
690     uint8_t meterMode = OHOS_CAMERA_OVERALL_METERING;
691     metaData->addEntry(OHOS_CONTROL_METER_MODE, &meterMode, sizeof(meterMode));
692 
693     uint8_t flashMode = OHOS_CAMERA_FLASH_MODE_ALWAYS_OPEN;
694     metaData->addEntry(OHOS_CONTROL_FLASH_MODE, &flashMode, sizeof(flashMode));
695 
696     uint8_t mirror = OHOS_CAMERA_MIRROR_ON;
697     metaData->addEntry(OHOS_CONTROL_CAPTURE_MIRROR, &mirror, sizeof(mirror));
698 
699     std::vector<int32_t> fpsRange;
700     fpsRange.push_back(FPS_RANGE);
701     fpsRange.push_back(FPS_RANGE);
702     metaData->addEntry(OHOS_CONTROL_FPS_RANGES, fpsRange.data(), fpsRange.size());
703 
704     int32_t orientation = OHOS_CAMERA_JPEG_ROTATION_180;
705     metaData->addEntry(OHOS_JPEG_ORIENTATION, &orientation, sizeof(orientation));
706 
707     uint8_t quality = OHOS_CAMERA_JPEG_LEVEL_HIGH;
708     metaData->addEntry(OHOS_JPEG_QUALITY, &quality, sizeof(quality));
709 
710     uint8_t afMode = OHOS_CAMERA_FOCUS_MODE_AUTO;
711     metaData->addEntry(OHOS_CONTROL_FOCUS_MODE, &afMode, sizeof(afMode));
712 
713     std::vector<int32_t> afRegions;
714     afRegions.push_back(AF_REGIONS_X);
715     afRegions.push_back(AF_REGIONS_Y);
716     metaData->addEntry(OHOS_CONTROL_AF_REGIONS, afRegions.data(), afRegions.size());
717 
718     uint8_t faceMode = OHOS_CAMERA_FACE_DETECT_MODE_SIMPLE;
719     metaData->addEntry(OHOS_STATISTICS_FACE_DETECT_SWITCH, &faceMode, sizeof(faceMode));
720 
721     std::vector<uint8_t> result;
722     OHOS::Camera::MetadataUtils::ConvertMetadataToVec(metaData, result);
723     demoCameraDevice_->UpdateSettings(result);
724 
725     DHLOGI("demo test: SetMetadata exit");
726 }
727 
FlashlightOnOff(bool onOff)728 void DcameraHdfDemo::FlashlightOnOff(bool onOff)
729 {
730     DHLOGI("demo test: FlashlightOnOff enter");
731 
732     if (demoCameraHost_ == nullptr) {
733         DHLOGE("demo test: FlashlightOnOff demoCameraHost_ == nullptr");
734         return;
735     }
736 
737     demoCameraHost_->SetFlashlight(cameraIds_.front(), onOff);
738 
739     DHLOGI("demo test: FlashlightOnOff exit ");
740 }
741 
StreamOffline(const int streamId)742 RetCode DcameraHdfDemo::StreamOffline(const int streamId)
743 {
744     int rc = 0;
745     constexpr size_t offlineDelayTime = 4;
746     DHLOGI("demo test: StreamOffline enter");
747     sptr<IStreamOperatorCallback> streamOperatorCallback(new DemoStreamOperatorCallback());
748     sptr<IOfflineStreamOperator> offlineStreamOperator = nullptr;
749     std::vector<int> streamIds;
750     streamIds.push_back(streamId);
751     rc = streamOperator_->ChangeToOfflineStream(streamIds, streamOperatorCallback, offlineStreamOperator);
752     if (rc != CamRetCode::METHOD_NOT_SUPPORTED) {
753         DHLOGE("demo test: StreamOffline ChangeToOfflineStream error");
754         return RC_ERROR;
755     }
756 
757     CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW);
758     CaptureOff(CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT);
759     sleep(1);
760     ReleaseAllStream();
761     ReleaseCameraDevice();
762     sleep(offlineDelayTime);
763 
764     DHLOGI("demo test: begin to release offlne stream");
765     if (offlineStreamOperator != nullptr) {
766         rc = offlineStreamOperator->CancelCapture(CAPTURE_ID_CAPTURE);
767         if (rc != CamRetCode::METHOD_NOT_SUPPORTED) {
768             DHLOGE("demo test: StreamOffline offlineStreamOperator->CancelCapture error");
769             return RC_ERROR;
770         }
771 
772         rc = offlineStreamOperator->Release();
773         if (rc != CamRetCode::METHOD_NOT_SUPPORTED) {
774             DHLOGE("demo test: StreamOffline offlineStreamOperator->Release() error");
775             return RC_ERROR;
776         }
777     }
778 
779     DHLOGI("demo test: StreamOffline exit");
780 
781     return RC_OK;
782 }
783 
GetFaceDetectMode(std::shared_ptr<CameraAbility> & ability)784 RetCode DcameraHdfDemo::GetFaceDetectMode(std::shared_ptr<CameraAbility> &ability)
785 {
786     common_metadata_header_t* data = ability->get();
787     uint8_t faceDetectMode;
788     camera_metadata_item_t entry;
789     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_DETECT_MODE, &entry);
790     if (ret != 0) {
791         DHLOGE("demo test: get OHOS_STATISTICS_FACE_DETECT_MODE error");
792         return RC_ERROR;
793     }
794     faceDetectMode = *(entry.data.u8);
795     DHLOGI("demo test: faceDetectMode %{public}d",  faceDetectMode);
796     return RC_OK;
797 }
798 
GetFocalLength(std::shared_ptr<CameraAbility> & ability)799 RetCode DcameraHdfDemo::GetFocalLength(std::shared_ptr<CameraAbility> &ability)
800 {
801     common_metadata_header_t* data = ability->get();
802     float focalLength = 0.0;
803     camera_metadata_item_t entry;
804     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_FOCAL_LENGTH, &entry);
805     if (ret != 0) {
806         DHLOGE("demo test:  get OHOS_ABILITY_FOCAL_LENGTH error");
807         return RC_ERROR;
808     }
809     focalLength = *(entry.data.f);
810     DHLOGI("demo test: focalLength %{public}f", focalLength);
811     return RC_OK;
812 }
813 
GetAvailableFocusModes(std::shared_ptr<CameraAbility> & ability)814 RetCode DcameraHdfDemo::GetAvailableFocusModes(std::shared_ptr<CameraAbility> &ability)
815 {
816     common_metadata_header_t* data = ability->get();
817     std::vector<uint8_t> focusMode;
818     camera_metadata_item_t entry;
819     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_FOCUS_MODES, &entry);
820     if (ret != 0) {
821         DHLOGE("demo test: get OHOS_ABILITY_FOCUS_MODES  error");
822         return RC_ERROR;
823     }
824     uint32_t count = entry.count;
825     DHLOGI("demo test: count  %{public}d",  count);
826 
827     for (uint32_t i = 0 ; i < count; i++) {
828         focusMode.push_back(*(entry.data.u8 + i));
829     }
830 
831     for (auto it = focusMode.begin(); it != focusMode.end(); it++) {
832         DHLOGI("demo test: focusMode : %{public}d ", *it);
833     }
834     return RC_OK;
835 }
836 
GetAvailableExposureModes(std::shared_ptr<CameraAbility> & ability)837 RetCode DcameraHdfDemo::GetAvailableExposureModes(std::shared_ptr<CameraAbility> &ability)
838 {
839     common_metadata_header_t* data = ability->get();
840     std::vector<uint8_t> exposureMode;
841     camera_metadata_item_t entry;
842     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_EXPOSURE_MODES, &entry);
843     if (ret != 0) {
844         DHLOGE("demo test: get OHOS_ABILITY_EXPOSURE_MODES  error");
845         return RC_ERROR;
846     }
847     uint32_t count = entry.count;
848     DHLOGI("demo test: count  %{public}d",  count);
849 
850     for (uint32_t i = 0 ; i < count; i++) {
851         exposureMode.push_back(*(entry.data.u8 + i));
852     }
853 
854     for (auto it = exposureMode.begin(); it != exposureMode.end(); it++) {
855         DHLOGI("demo test: exposureMode : %{public}d ", *it);
856     }
857     return RC_OK;
858 }
859 
GetExposureCompensationRange(std::shared_ptr<CameraAbility> & ability)860 RetCode DcameraHdfDemo::GetExposureCompensationRange(std::shared_ptr<CameraAbility> &ability)
861 {
862     common_metadata_header_t* data = ability->get();
863     std::vector<int32_t>  exposureCompensationRange;
864     camera_metadata_item_t entry;
865     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_AE_COMPENSATION_RANGE, &entry);
866     if (ret != 0) {
867         DHLOGE("demo test: get OHOS_ABILITY_AE_COMPENSATION_RANGE error");
868         return RC_ERROR;
869     }
870 
871     uint32_t count = entry.count;
872     DHLOGI("demo test:  exposureCompensationRange count  %{public}d",  count);
873     for (uint32_t i = 0 ; i < count; i++) {
874         exposureCompensationRange.push_back(*(entry.data.i32 + i));
875     }
876 
877     for (auto it = exposureCompensationRange.begin(); it != exposureCompensationRange.end(); it++) {
878         DHLOGI("demo test: exposureCompensationRange %{public}d ", *it);
879     }
880 
881     return RC_OK;
882 }
883 
GetExposureCompensationSteps(std::shared_ptr<CameraAbility> & ability)884 RetCode DcameraHdfDemo::GetExposureCompensationSteps(std::shared_ptr<CameraAbility> &ability)
885 {
886     common_metadata_header_t* data = ability->get();
887     camera_rational_t exposureCompensationSteps;
888     camera_metadata_item_t entry;
889     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_AE_COMPENSATION_STEP, &entry);
890     if (ret != 0) {
891         DHLOGE("demo test: get OHOS_ABILITY_AE_COMPENSATION_STEP error");
892         return RC_ERROR;
893     }
894     exposureCompensationSteps.numerator = entry.data.r->numerator;
895     exposureCompensationSteps.denominator = entry.data.r->denominator;
896     DHLOGI("demo test: steps.numerator %{public}d  and steps.denominator %{public}d ",
897         exposureCompensationSteps.numerator, exposureCompensationSteps.denominator);
898     return RC_OK;
899 }
900 
GetAvailableMeterModes(std::shared_ptr<CameraAbility> & ability)901 RetCode DcameraHdfDemo::GetAvailableMeterModes(std::shared_ptr<CameraAbility> &ability)
902 {
903     common_metadata_header_t* data = ability->get();
904     std::vector<uint8_t> meterModes;
905     camera_metadata_item_t entry;
906     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_METER_MODES, &entry);
907     if (ret != 0) {
908         DHLOGE("demo test: get OHOS_ABILITY_METER_MODES  error");
909         return RC_ERROR;
910     }
911     uint32_t count = entry.count;
912     DHLOGI("demo test: count  %{public}d",  count);
913 
914     for (uint32_t i = 0 ; i < count; i++) {
915         meterModes.push_back(*(entry.data.u8 + i));
916     }
917 
918     for (auto it = meterModes.begin(); it != meterModes.end(); it++) {
919         DHLOGI("demo test: meterModes : %{public}d ", *it);
920     }
921     return RC_OK;
922 }
923 
GetAvailableFlashModes(std::shared_ptr<CameraAbility> & ability)924 RetCode DcameraHdfDemo::GetAvailableFlashModes(std::shared_ptr<CameraAbility> &ability)
925 {
926     common_metadata_header_t* data = ability->get();
927     std::vector<uint8_t> flashModes;
928     camera_metadata_item_t entry;
929     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_FLASH_MODES, &entry);
930     if (ret != 0) {
931         DHLOGE("demo test: get OHOS_ABILITY_FLASH_MODES  error");
932         return RC_ERROR;
933     }
934     uint32_t count = entry.count;
935     DHLOGI("demo test: count  %{public}d",  count);
936 
937     for (uint32_t i = 0 ; i < count; i++) {
938         flashModes.push_back(*(entry.data.u8 + i));
939     }
940 
941     for (auto it = flashModes.begin(); it != flashModes.end(); it++) {
942         DHLOGI("demo test: flashModes : %{public}d ", *it);
943     }
944     return RC_OK;
945 }
946 
GetMirrorSupported(std::shared_ptr<CameraAbility> & ability)947 RetCode DcameraHdfDemo::GetMirrorSupported(std::shared_ptr<CameraAbility> &ability)
948 {
949     common_metadata_header_t* data = ability->get();
950     uint8_t mirrorSupported;
951     camera_metadata_item_t entry;
952     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED, &entry);
953     if (ret != 0) {
954         DHLOGE("demo test: get OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED error");
955         return RC_ERROR;
956     }
957     mirrorSupported = *(entry.data.u8);
958     DHLOGI("demo test: mirrorSupported  %{public}d",  mirrorSupported);
959     return RC_OK;
960 }
961 
GetStreamBasicConfigurations(std::shared_ptr<CameraAbility> & ability)962 RetCode DcameraHdfDemo::GetStreamBasicConfigurations(std::shared_ptr<CameraAbility> &ability)
963 {
964     common_metadata_header_t* data = ability->get();
965     std::vector<int32_t>  streamBasicConfigurations;
966     camera_metadata_item_t entry;
967     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, &entry);
968     if (ret != 0) {
969         DHLOGE("demo test: get OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS error");
970         return RC_ERROR;
971     }
972 
973     uint32_t count = entry.count;
974     DHLOGI("demo test: streamBasicConfigurations count  %{public}d",  count);
975     for (uint32_t i = 0 ; i < count; i++) {
976         streamBasicConfigurations.push_back(*(entry.data.i32 + i));
977     }
978 
979     for (auto it = streamBasicConfigurations.begin(); it != streamBasicConfigurations.end(); it++) {
980         DHLOGI("demo test: streamBasicConfigurations %{public}d ", *it);
981     }
982 
983     return RC_OK;
984 }
985 
GetFpsRange(std::shared_ptr<CameraAbility> & ability)986 RetCode DcameraHdfDemo::GetFpsRange(std::shared_ptr<CameraAbility> &ability)
987 {
988     common_metadata_header_t* data = ability->get();
989     std::vector<int32_t>  fpsRange;
990     camera_metadata_item_t entry;
991     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_FPS_RANGES, &entry);
992     if (ret != 0) {
993         DHLOGE("demo test: get OHOS_ABILITY_FPS_RANGES error");
994         return RC_ERROR;
995     }
996 
997     uint32_t count = entry.count;
998     DHLOGI("demo test: fpsRange count  %{public}d",  count);
999     for (uint32_t i = 0 ; i < count; i++) {
1000         fpsRange.push_back(*(entry.data.i32 + i));
1001     }
1002 
1003     for (auto it = fpsRange.begin(); it != fpsRange.end(); it++) {
1004         DHLOGI("demo test: fpsRange %{public}d ", *it);
1005     }
1006 
1007     return RC_OK;
1008 }
1009 
GetCameraPosition(std::shared_ptr<CameraAbility> & ability)1010 RetCode DcameraHdfDemo::GetCameraPosition(std::shared_ptr<CameraAbility> &ability)
1011 {
1012     common_metadata_header_t* data = ability->get();
1013     uint8_t  cameraPosition;
1014     camera_metadata_item_t entry;
1015     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_CAMERA_POSITION, &entry);
1016     if (ret != 0) {
1017         DHLOGE("demo test: get OHOS_ABILITY_CAMERA_POSITION error");
1018         return RC_ERROR;
1019     }
1020 
1021     cameraPosition= *(entry.data.u8);
1022     DHLOGI("demo test: cameraPosition  %{public}d", cameraPosition);
1023     return RC_OK;
1024 }
1025 
GetCameraType(std::shared_ptr<CameraAbility> & ability)1026 RetCode DcameraHdfDemo::GetCameraType(std::shared_ptr<CameraAbility> &ability)
1027 {
1028     common_metadata_header_t* data = ability->get();
1029     uint8_t  cameraType;
1030     camera_metadata_item_t entry;
1031     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_CAMERA_TYPE, &entry);
1032     if (ret != 0) {
1033         DHLOGE("demo test: get OHOS_ABILITY_CAMERA_TYPE error");
1034         return RC_ERROR;
1035     }
1036 
1037     cameraType= *(entry.data.u8);
1038     DHLOGI("demo test: cameraType  %{public}d", cameraType);
1039     return RC_OK;
1040 }
1041 
GetCameraConnectionType(std::shared_ptr<CameraAbility> & ability)1042 RetCode DcameraHdfDemo::GetCameraConnectionType(std::shared_ptr<CameraAbility> &ability)
1043 {
1044     common_metadata_header_t* data = ability->get();
1045     uint8_t  cameraConnectionType;
1046     camera_metadata_item_t entry;
1047     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &entry);
1048     if (ret != 0) {
1049         DHLOGE("demo test: get OHOS_ABILITY_CAMERA_CONNECTION_TYPE error");
1050         return RC_ERROR;
1051     }
1052 
1053     cameraConnectionType= *(entry.data.u8);
1054     DHLOGI("demo test: cameraConnectionType  %{public}d", cameraConnectionType);
1055     return RC_OK;
1056 }
1057 
GetFaceDetectMaxNum(std::shared_ptr<CameraAbility> & ability)1058 RetCode DcameraHdfDemo::GetFaceDetectMaxNum(std::shared_ptr<CameraAbility> &ability)
1059 {
1060     common_metadata_header_t* data = ability->get();
1061     uint8_t  faceDetectMaxNum;
1062     camera_metadata_item_t entry;
1063     int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_DETECT_MAX_NUM, &entry);
1064     if (ret != 0) {
1065         DHLOGE("demo test: get OHOS_STATISTICS_FACE_DETECT_MAX_NUM error");
1066         return RC_ERROR;
1067     }
1068     faceDetectMaxNum = *(entry.data.u8);
1069     DHLOGI("demo test: faceDetectMaxNum %{public}d ", faceDetectMaxNum);
1070     return RC_OK;
1071 }
1072 
OnError(ErrorType type,int32_t errorCode)1073 int32_t DemoCameraDeviceCallback::OnError(ErrorType type, int32_t errorCode)
1074 {
1075     DHLOGI("demo test: OnError type : %{public}d, errorCode : %{public}d", type, errorCode);
1076     return RC_OK;
1077 }
1078 
OnResult(uint64_t timestamp,const std::vector<uint8_t> & result)1079 int32_t DemoCameraDeviceCallback::OnResult(uint64_t timestamp, const std::vector<uint8_t>& result)
1080 {
1081     DHLOGI("demo test: OnResult timestamp : %{public}" PRIu64, timestamp);
1082     std::shared_ptr<OHOS::Camera::CameraMetadata> updateSettings;
1083 
1084     OHOS::Camera::MetadataUtils::ConvertVecToMetadata(result, updateSettings);
1085     for (auto it = results_list_.cbegin(); it != results_list_.cend(); it++) {
1086         switch (*it) {
1087             case OHOS_CONTROL_FOCUS_MODE: {
1088                 common_metadata_header_t* data = updateSettings->get();
1089                 uint8_t focusMode;
1090                 camera_metadata_item_t entry;
1091                 int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_CONTROL_FOCUS_MODE, &entry);
1092                 if (ret != 0) {
1093                     DHLOGE("demo test: get OHOS_CONTROL_FOCUS_MODE error");
1094                     return RC_ERROR;
1095                 }
1096                 focusMode = *(entry.data.u8);
1097                 DHLOGI("demo test: focusMode %{public}d", focusMode);
1098                 break;
1099             }
1100             case OHOS_CONTROL_EXPOSURE_MODE: {
1101                 common_metadata_header_t* data = updateSettings->get();
1102                 uint8_t exposureMode;
1103                 camera_metadata_item_t entry;
1104                 int ret = OHOS::Camera::FindCameraMetadataItem(data, OHOS_CONTROL_EXPOSURE_MODE, &entry);
1105                 if (ret != 0) {
1106                     return RC_ERROR;
1107                 }
1108                 exposureMode = *(entry.data.u8);
1109                 DHLOGI("demo test: exposureMode %{public}d", exposureMode);
1110                 break;
1111             }
1112             default:
1113                 return RC_ERROR;
1114         }
1115     }
1116 
1117     return RC_OK;
1118 }
1119 
OnCameraStatus(const std::string & cameraId,CameraStatus status)1120 int32_t DemoCameraHostCallback::OnCameraStatus(const std::string& cameraId, CameraStatus status)
1121 {
1122     DHLOGI("%{public}s, enter. cameraId = %{public}s, status = %{public}d",
1123         __func__, cameraId.c_str(), static_cast<int>(status));
1124     return RC_OK;
1125 }
1126 
OnFlashlightStatus(const std::string & cameraId,FlashlightStatus status)1127 int32_t DemoCameraHostCallback::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status)
1128 {
1129     DHLOGI("%{public}s, enter. cameraId = %{public}s, status = %{public}d",
1130         __func__, cameraId.c_str(), static_cast<int>(status));
1131     return RC_OK;
1132 }
1133 
OnCameraEvent(const std::string & cameraId,CameraEvent event)1134 int32_t DemoCameraHostCallback::OnCameraEvent(const std::string& cameraId, CameraEvent event)
1135 {
1136     DHLOGI("%{public}s, enter. cameraId = %{public}s, event = %{public}d",
1137         __func__, cameraId.c_str(), static_cast<int>(event));
1138     return RC_OK;
1139 }
1140 
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamIds)1141 int32_t DemoStreamOperatorCallback::OnCaptureStarted(int32_t captureId, const std::vector<int32_t>& streamIds)
1142 {
1143     DHLOGI("%{public}s, enter. captureId = %{public}d, streamIds size = %{public}zu", __func__, captureId,
1144         streamIds.size());
1145     return RC_OK;
1146 }
1147 
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)1148 int32_t DemoStreamOperatorCallback::OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo>& infos)
1149 {
1150     DHLOGI("%{public}s, enter. captureId = %{public}d, infos size = %{public}zu", __func__, captureId, infos.size());
1151     return RC_OK;
1152 }
1153 
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)1154 int32_t DemoStreamOperatorCallback::OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo>& infos)
1155 {
1156     DHLOGI("%{public}s, enter. captureId = %{public}d, infos size = %{public}zu", __func__, captureId, infos.size());
1157     return RC_OK;
1158 }
1159 
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)1160 int32_t DemoStreamOperatorCallback::OnFrameShutter(int32_t captureId,
1161     const std::vector<int32_t>& streamIds, uint64_t timestamp)
1162 {
1163     DHLOGI("%{public}s, enter. captureId = %{public}d, streamIds size = %{public}zu, timestamp = %{public}" PRIu64,
1164         __func__, captureId, streamIds.size(), timestamp);
1165     return RC_OK;
1166 }
1167 }
1168 } // namespace OHOS::DistributedHardware