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