1 /*
2 * Copyright (c) 2021-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 "hstream_repeat.h"
17
18 #include <cstdint>
19
20 #ifdef NOTIFICATION_ENABLE
21 #include "camera_beauty_notification.h"
22 #endif
23 #include "camera_device_ability_items.h"
24 #include "camera_log.h"
25 #include "camera_metadata_operator.h"
26 #include "camera_service_ipc_interface_code.h"
27 #include "display_manager.h"
28 #include "camera_util.h"
29 #include "hstream_common.h"
30 #include "ipc_skeleton.h"
31 #include "istream_repeat_callback.h"
32 #include "metadata_utils.h"
33 #include "camera_report_uitls.h"
34 #include "parameters.h"
35
36
37 namespace OHOS {
38 namespace CameraStandard {
39 using namespace OHOS::HDI::Camera::V1_0;
HStreamRepeat(sptr<OHOS::IBufferProducer> producer,int32_t format,int32_t width,int32_t height,RepeatStreamType type)40 HStreamRepeat::HStreamRepeat(
41 sptr<OHOS::IBufferProducer> producer, int32_t format, int32_t width, int32_t height, RepeatStreamType type)
42 : HStreamCommon(StreamType::REPEAT, producer, format, width, height), repeatStreamType_(type)
43 {
44 MEDIA_INFO_LOG("HStreamRepeat::HStreamRepeat construct, format:%{public}d size:%{public}dx%{public}d "
45 "repeatType:%{public}d, streamId:%{public}d",
46 format, width, height, type, GetFwkStreamId());
47 }
48
~HStreamRepeat()49 HStreamRepeat::~HStreamRepeat()
50 {
51 MEDIA_INFO_LOG("HStreamRepeat::~HStreamRepeat deconstruct, format:%{public}d size:%{public}dx%{public}d "
52 "repeatType:%{public}d, streamId:%{public}d, hdiStreamId:%{public}d",
53 format_, width_, height_, repeatStreamType_, GetFwkStreamId(), GetHdiStreamId());
54 #ifdef NOTIFICATION_ENABLE
55 CancelNotification();
56 #endif
57 }
58
LinkInput(sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator,std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility)59 int32_t HStreamRepeat::LinkInput(sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator,
60 std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility)
61 {
62 MEDIA_INFO_LOG(
63 "HStreamRepeat::LinkInput streamId:%{public}d ,repeatStreamType:%{public}d",
64 GetFwkStreamId(), repeatStreamType_);
65 int32_t ret = HStreamCommon::LinkInput(streamOperator, cameraAbility);
66 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret,
67 "HStreamRepeat::LinkInput err, streamId:%{public}d ,err:%{public}d", GetFwkStreamId(), ret);
68 if (repeatStreamType_ != RepeatStreamType::VIDEO) {
69 SetStreamTransform();
70 }
71 return CAMERA_OK;
72 }
73
SetVideoStreamInfo(StreamInfo_V1_1 & streamInfo)74 void HStreamRepeat::SetVideoStreamInfo(StreamInfo_V1_1& streamInfo)
75 {
76 streamInfo.v1_0.intent_ = StreamIntent::VIDEO;
77 streamInfo.v1_0.encodeType_ = ENCODE_TYPE_H264;
78 MEDIA_INFO_LOG("HStreamRepeat::SetVideoStreamInfo Enter");
79 HDI::Camera::V1_1::ExtendedStreamInfo extendedStreamInfo {
80 .type = static_cast<HDI::Camera::V1_1::ExtendedStreamInfoType>(
81 HDI::Camera::V1_3::ExtendedStreamInfoType::EXTENDED_STREAM_INFO_MAKER_INFO),
82 .width = 0, .height = 0, .format = 0, .dataspace = 0, .bufferQueue = nullptr
83 };
84 extendedStreamInfo.bufferQueue = metaSurfaceBufferQueue_;
85 MEDIA_INFO_LOG("HStreamRepeat::SetVideoStreamInfo end");
86 streamInfo.extendedStreamInfos = { extendedStreamInfo };
87 }
88
SetStreamInfo(StreamInfo_V1_1 & streamInfo)89 void HStreamRepeat::SetStreamInfo(StreamInfo_V1_1& streamInfo)
90 {
91 HStreamCommon::SetStreamInfo(streamInfo);
92 auto metaProducerSequenceable = metaProducer_ == nullptr ? nullptr : new BufferProducerSequenceable(metaProducer_);
93 HDI::Camera::V1_1::ExtendedStreamInfo metaExtendedStreamInfo {
94 .type = static_cast<HDI::Camera::V1_1::ExtendedStreamInfoType>(4), .width = 0, .height = 0, .format = 0,
95 .dataspace = 0, .bufferQueue = metaProducerSequenceable
96 };
97 switch (repeatStreamType_) {
98 case RepeatStreamType::LIVEPHOTO:
99 streamInfo.v1_0.intent_ = StreamIntent::VIDEO;
100 streamInfo.v1_0.encodeType_ = ENCODE_TYPE_H264;
101 streamInfo.extendedStreamInfos = { metaExtendedStreamInfo };
102 break;
103 case RepeatStreamType::VIDEO:
104 SetVideoStreamInfo(streamInfo);
105 break;
106 case RepeatStreamType::PREVIEW:
107 streamInfo.v1_0.intent_ = StreamIntent::PREVIEW;
108 streamInfo.v1_0.encodeType_ = ENCODE_TYPE_NULL;
109 if (mEnableSecure) {
110 MEDIA_INFO_LOG("HStreamRepeat::SetStreamInfo Enter");
111 HDI::Camera::V1_1::ExtendedStreamInfo extendedStreamInfo {
112 .type = static_cast<HDI::Camera::V1_1::ExtendedStreamInfoType>(
113 HDI::Camera::V1_3::ExtendedStreamInfoType::EXTENDED_STREAM_INFO_SECURE),
114 .width = 0, .height = 0, .format = 0, .dataspace = 0, .bufferQueue = nullptr
115 };
116 MEDIA_INFO_LOG("HStreamRepeat::SetStreamInfo end");
117 streamInfo.extendedStreamInfos = { extendedStreamInfo };
118 }
119 break;
120 case RepeatStreamType::SKETCH:
121 streamInfo.v1_0.intent_ = StreamIntent::PREVIEW;
122 streamInfo.v1_0.encodeType_ = ENCODE_TYPE_NULL;
123 HDI::Camera::V1_1::ExtendedStreamInfo extendedStreamInfo {
124 .type = static_cast<HDI::Camera::V1_1::ExtendedStreamInfoType>(
125 HDI::Camera::V1_2::EXTENDED_STREAM_INFO_SKETCH),
126 .width = 0, .height = 0, .format = 0, .dataspace = 0, .bufferQueue = nullptr
127 };
128 streamInfo.extendedStreamInfos = { extendedStreamInfo };
129 break;
130 }
131 }
132
SetMetaProducer(sptr<OHOS::IBufferProducer> metaProducer)133 void HStreamRepeat::SetMetaProducer(sptr<OHOS::IBufferProducer> metaProducer)
134 {
135 std::lock_guard<std::mutex> lock(producerLock_);
136 metaProducer_ = metaProducer;
137 }
138
SetMovingPhotoStartCallback(std::function<void ()> callback)139 void HStreamRepeat::SetMovingPhotoStartCallback(std::function<void()> callback)
140 {
141 std::lock_guard<std::mutex> lock(movingPhotoCallbackLock_);
142 startMovingPhotoCallback_ = callback;
143 }
144
UpdateSketchStatus(SketchStatus status)145 void HStreamRepeat::UpdateSketchStatus(SketchStatus status)
146 {
147 if (repeatStreamType_ != RepeatStreamType::SKETCH) {
148 return;
149 }
150 auto parent = parentStreamRepeat_.promote();
151 if (parent == nullptr) {
152 return;
153 }
154 if (sketchStatus_ != status) {
155 sketchStatus_ = status;
156 parent->OnSketchStatusChanged(sketchStatus_);
157 }
158 }
159
StartSketchStream(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)160 void HStreamRepeat::StartSketchStream(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)
161 {
162 CAMERA_SYNC_TRACE;
163 MEDIA_DEBUG_LOG("HStreamRepeat::StartSketchStream Enter");
164 sptr<HStreamRepeat> sketchStreamRepeat;
165 {
166 std::lock_guard<std::mutex> lock(sketchStreamLock_);
167 if (sketchStreamRepeat_ == nullptr || sketchStreamRepeat_->sketchRatio_ <= 0) {
168 MEDIA_DEBUG_LOG("HStreamRepeat::StartSketchStream sketchStreamRepeat_ is null or ratio is illegal");
169 return;
170 }
171 sketchStreamRepeat = sketchStreamRepeat_;
172 }
173 camera_metadata_item_t item;
174 int32_t ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_ZOOM_RATIO, &item);
175 if (ret != CAM_META_SUCCESS || item.count <= 0) {
176 MEDIA_DEBUG_LOG("HStreamRepeat::StartSketchStream get OHOS_CONTROL_ZOOM_RATIO fail");
177 return;
178 }
179 float tagRatio = *item.data.f;
180 MEDIA_DEBUG_LOG("HStreamRepeat::StartSketchStream OHOS_CONTROL_ZOOM_RATIO >>> tagRatio:%{public}f -- "
181 "sketchRatio:%{public}f",
182 tagRatio, sketchStreamRepeat->sketchRatio_);
183 if (sketchStreamRepeat->sketchRatio_ > 0 &&
184 tagRatio - sketchStreamRepeat->sketchRatio_ >= -std::numeric_limits<float>::epsilon()) {
185 sketchStreamRepeat->Start();
186 }
187 MEDIA_DEBUG_LOG("HStreamRepeat::StartSketchStream Exit");
188 }
189
SetUsedAsPosition(camera_position_enum_t cameraPosition)190 void HStreamRepeat::SetUsedAsPosition(camera_position_enum_t cameraPosition)
191 {
192 MEDIA_INFO_LOG("HStreamRepeat::SetUsedAsPosition %{public}d", cameraPosition);
193 cameraUsedAsPosition_ = cameraPosition;
194 SetStreamTransform();
195 }
196
Start(std::shared_ptr<OHOS::Camera::CameraMetadata> settings,bool isUpdateSeetings)197 int32_t HStreamRepeat::Start(std::shared_ptr<OHOS::Camera::CameraMetadata> settings, bool isUpdateSeetings)
198 {
199 CAMERA_SYNC_TRACE;
200 auto streamOperator = GetStreamOperator();
201 CHECK_AND_RETURN_RET(streamOperator != nullptr, CAMERA_INVALID_STATE);
202 auto preparedCaptureId = GetPreparedCaptureId();
203 CHECK_ERROR_RETURN_RET_LOG(!isUpdateSeetings && preparedCaptureId != CAPTURE_ID_UNSET, CAMERA_INVALID_STATE,
204 "HStreamRepeat::Start, Already started with captureID: %{public}d", preparedCaptureId);
205 // If current is sketch stream, check parent is start or not.
206 if (repeatStreamType_ == RepeatStreamType::SKETCH) {
207 auto parentRepeat = parentStreamRepeat_.promote();
208 CHECK_ERROR_RETURN_RET_LOG(parentRepeat == nullptr || parentRepeat->GetPreparedCaptureId() == CAPTURE_ID_UNSET,
209 CAMERA_INVALID_STATE, "HStreamRepeat::Start sketch parent state is illegal");
210 }
211 if (!isUpdateSeetings) {
212 int32_t ret = PrepareCaptureId();
213 preparedCaptureId = GetPreparedCaptureId();
214 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK || preparedCaptureId == CAPTURE_ID_UNSET, ret,
215 "HStreamRepeat::Start Failed to allocate a captureId");
216 }
217 UpdateSketchStatus(SketchStatus::STARTING);
218
219 std::vector<uint8_t> ability;
220 {
221 std::lock_guard<std::mutex> lock(cameraAbilityLock_);
222 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(cameraAbility_, ability);
223 }
224 std::shared_ptr<OHOS::Camera::CameraMetadata> dynamicSetting = nullptr;
225 OHOS::Camera::MetadataUtils::ConvertVecToMetadata(ability, dynamicSetting);
226 if (dynamicSetting == nullptr) {
227 dynamicSetting = std::make_shared<OHOS::Camera::CameraMetadata>(0, 0);
228 }
229 // open video dfx switch for hal, no need close
230 if (repeatStreamType_ == RepeatStreamType::PREVIEW) {
231 OpenVideoDfxSwitch(dynamicSetting);
232 }
233 if (repeatStreamType_ == RepeatStreamType::VIDEO || repeatStreamType_ == RepeatStreamType::LIVEPHOTO) {
234 UpdateVideoSettings(dynamicSetting);
235 }
236 if (repeatStreamType_ == RepeatStreamType::PREVIEW || repeatStreamType_ == RepeatStreamType::VIDEO) {
237 UpdateFrameRateSettings(dynamicSetting);
238 }
239 if (settings != nullptr) {
240 UpdateFrameMuteSettings(settings, dynamicSetting);
241 }
242 #ifdef NOTIFICATION_ENABLE
243 bool isNeedBeautyNotification = IsNeedBeautyNotification();
244 if (isNeedBeautyNotification && CameraBeautyNotification::GetInstance()->GetBeautyStatus() == BEAUTY_STATUS_ON) {
245 UpdateBeautySettings(dynamicSetting);
246 }
247 #endif
248
249 std::vector<uint8_t> captureSetting;
250 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(dynamicSetting, captureSetting);
251
252 CaptureInfo captureInfo;
253 captureInfo.streamIds_ = { GetHdiStreamId() };
254 captureInfo.captureSetting_ = captureSetting;
255 captureInfo.enableShutterCallback_ = false;
256 MEDIA_INFO_LOG("HStreamRepeat::Start streamId:%{public}d hdiStreamId:%{public}d With capture ID: %{public}d, "
257 "repeatStreamType:%{public}d",
258 GetFwkStreamId(), GetHdiStreamId(), preparedCaptureId, repeatStreamType_);
259 if (repeatStreamType_ == RepeatStreamType::VIDEO) {
260 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
261 const std::string permissionName = "ohos.permission.CAMERA";
262 AddCameraPermissionUsedRecord(callingTokenId, permissionName);
263 }
264 int32_t ret = 0;
265 {
266 std::lock_guard<std::mutex> startStopLock(streamStartStopLock_);
267 HStreamCommon::PrintCaptureDebugLog(dynamicSetting);
268 CamRetCode rc = (CamRetCode)(streamOperator->Capture(preparedCaptureId, captureInfo, true));
269 if (rc != HDI::Camera::V1_0::NO_ERROR) {
270 ResetCaptureId();
271 MEDIA_ERR_LOG("HStreamRepeat::Start Failed with error Code:%{public}d", rc);
272 CameraReportUtils::ReportCameraError(
273 "HStreamRepeat::Start", rc, true, CameraReportUtils::GetCallerInfo());
274 ret = HdiToServiceError(rc);
275 UpdateSketchStatus(SketchStatus::STOPED);
276 } else {
277 repeatStreamStatus_ = RepeatStreamStatus::STARTED;
278 }
279 }
280 if (settings != nullptr) {
281 StartSketchStream(settings);
282 }
283 #ifdef NOTIFICATION_ENABLE
284 if (isNeedBeautyNotification) {
285 CameraBeautyNotification::GetInstance()->PublishNotification(true);
286 }
287 #endif
288 return ret;
289 }
290
Start()291 int32_t HStreamRepeat::Start()
292 {
293 return Start(nullptr);
294 }
295
Stop()296 int32_t HStreamRepeat::Stop()
297 {
298 CAMERA_SYNC_TRACE;
299 auto streamOperator = GetStreamOperator();
300 CHECK_ERROR_RETURN_RET_LOG(streamOperator == nullptr, CAMERA_INVALID_STATE,
301 "HStreamRepeat::Stop streamOperator is null");
302 auto preparedCaptureId = GetPreparedCaptureId();
303 MEDIA_INFO_LOG("HStreamRepeat::Stop streamId:%{public}d hdiStreamId:%{public}d With capture ID: %{public}d, "
304 "repeatStreamType:%{public}d",
305 GetFwkStreamId(), GetHdiStreamId(), preparedCaptureId, repeatStreamType_);
306 CHECK_ERROR_RETURN_RET_LOG(preparedCaptureId == CAPTURE_ID_UNSET, CAMERA_INVALID_STATE,
307 "HStreamRepeat::Stop, Stream not started yet");
308 UpdateSketchStatus(SketchStatus::STOPPING);
309 int32_t ret = CAMERA_OK;
310 {
311 std::lock_guard<std::mutex> startStopLock(streamStartStopLock_);
312 ret = StopStream();
313 if (ret != CAMERA_OK) {
314 MEDIA_ERR_LOG("HStreamRepeat::Stop Failed with errorCode:%{public}d, curCaptureID_: %{public}d",
315 ret, preparedCaptureId);
316 } else {
317 repeatStreamStatus_ = RepeatStreamStatus::STOPED;
318 }
319 }
320 {
321 std::lock_guard<std::mutex> lock(sketchStreamLock_);
322 if (sketchStreamRepeat_ != nullptr) {
323 sketchStreamRepeat_->Stop();
324 }
325 }
326 return ret;
327 }
328
Release()329 int32_t HStreamRepeat::Release()
330 {
331 return ReleaseStream(false);
332 }
333
ReleaseStream(bool isDelay)334 int32_t HStreamRepeat::ReleaseStream(bool isDelay)
335 {
336 {
337 std::lock_guard<std::mutex> lock(callbackLock_);
338 streamRepeatCallback_ = nullptr;
339 }
340
341 {
342 std::lock_guard<std::mutex> lock(sketchStreamLock_);
343 if (sketchStreamRepeat_ != nullptr) {
344 sketchStreamRepeat_->Release();
345 }
346 }
347 return HStreamCommon::ReleaseStream(isDelay);
348 }
349
SetCallback(sptr<IStreamRepeatCallback> & callback)350 int32_t HStreamRepeat::SetCallback(sptr<IStreamRepeatCallback>& callback)
351 {
352 CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG, "HStreamRepeat::SetCallback callback is null");
353 std::lock_guard<std::mutex> lock(callbackLock_);
354 streamRepeatCallback_ = callback;
355 return CAMERA_OK;
356 }
357
OnFrameStarted()358 int32_t HStreamRepeat::OnFrameStarted()
359 {
360 CAMERA_SYNC_TRACE;
361 {
362 std::lock_guard<std::mutex> lock(callbackLock_);
363 if (streamRepeatCallback_ != nullptr) {
364 streamRepeatCallback_->OnFrameStarted();
365 }
366 }
367 if (repeatStreamType_ == RepeatStreamType::VIDEO) {
368 // report video start dfx
369 DfxCaptureInfo captureInfo;
370 captureInfo.captureId = 1;
371 captureInfo.caller = CameraReportUtils::GetCallerInfo();
372 CameraReportUtils::GetInstance().SetVideoStartInfo(captureInfo);
373 }
374
375 UpdateSketchStatus(SketchStatus::STARTED);
376 return CAMERA_OK;
377 }
378
OnFrameEnded(int32_t frameCount)379 int32_t HStreamRepeat::OnFrameEnded(int32_t frameCount)
380 {
381 CAMERA_SYNC_TRACE;
382 {
383 std::lock_guard<std::mutex> lock(callbackLock_);
384 if (streamRepeatCallback_ != nullptr) {
385 streamRepeatCallback_->OnFrameEnded(frameCount);
386 }
387 }
388 if (repeatStreamType_ == RepeatStreamType::VIDEO) {
389 // report video end dfx
390 CameraReportUtils::GetInstance().SetVideoEndInfo(1);
391 }
392 UpdateSketchStatus(SketchStatus::STOPED);
393 return CAMERA_OK;
394 }
395
OnDeferredVideoEnhancementInfo(CaptureEndedInfoExt captureEndedInfo)396 int32_t HStreamRepeat::OnDeferredVideoEnhancementInfo(CaptureEndedInfoExt captureEndedInfo)
397 {
398 CAMERA_SYNC_TRACE;
399 MEDIA_INFO_LOG("HStreamRepeat::OnDeferredVideoEnhancementInfo");
400 if (repeatStreamType_ == RepeatStreamType::VIDEO) {
401 // report video end dfx
402 CameraReportUtils::GetInstance().SetVideoEndInfo(1);
403 std::lock_guard<std::mutex> lock(callbackLock_);
404 if (streamRepeatCallback_ != nullptr) {
405 streamRepeatCallback_->OnDeferredVideoEnhancementInfo(captureEndedInfo);
406 }
407 }
408 return CAMERA_OK;
409 }
410
OnFrameError(int32_t errorType)411 int32_t HStreamRepeat::OnFrameError(int32_t errorType)
412 {
413 std::lock_guard<std::mutex> lock(callbackLock_);
414 MEDIA_DEBUG_LOG("HStreamRepeat::OnFrameError %{public}d, %{public}d", errorType, streamRepeatCallback_ == nullptr);
415 if (errorType == HDI::Camera::V1_3::HIGH_TEMPERATURE_ERROR) {
416 UpdateSketchStatus(SketchStatus::STOPED);
417 }
418 if (streamRepeatCallback_ != nullptr) {
419 int32_t repeatErrorCode;
420 if (errorType == BUFFER_LOST) {
421 repeatErrorCode = CAMERA_STREAM_BUFFER_LOST;
422 } else {
423 repeatErrorCode = CAMERA_UNKNOWN_ERROR;
424 }
425 CAMERA_SYSEVENT_FAULT(CreateMsg("Preview OnFrameError! errorCode:%d", repeatErrorCode));
426 streamRepeatCallback_->OnFrameError(repeatErrorCode);
427 }
428 return CAMERA_OK;
429 }
430
OnSketchStatusChanged(SketchStatus status)431 int32_t HStreamRepeat::OnSketchStatusChanged(SketchStatus status)
432 {
433 std::lock_guard<std::mutex> lock(callbackLock_);
434 MEDIA_DEBUG_LOG("HStreamRepeat::OnSketchStatusChanged %{public}d", status);
435 if (streamRepeatCallback_ != nullptr) {
436 streamRepeatCallback_->OnSketchStatusChanged(status);
437 }
438 return CAMERA_OK;
439 }
440
AddDeferredSurface(const sptr<OHOS::IBufferProducer> & producer)441 int32_t HStreamRepeat::AddDeferredSurface(const sptr<OHOS::IBufferProducer>& producer)
442 {
443 MEDIA_INFO_LOG("HStreamRepeat::AddDeferredSurface called");
444 {
445 std::lock_guard<std::mutex> lock(producerLock_);
446 CHECK_ERROR_RETURN_RET_LOG(producer == nullptr, CAMERA_INVALID_ARG,
447 "HStreamRepeat::AddDeferredSurface producer is null");
448 producer_ = producer;
449 }
450 SetStreamTransform();
451 auto streamOperator = GetStreamOperator();
452 CHECK_ERROR_RETURN_RET_LOG(streamOperator == nullptr, CAMERA_INVALID_STATE,
453 "HStreamRepeat::CreateAndHandleDeferredStreams(), streamOperator_ == null");
454 MEDIA_INFO_LOG("HStreamRepeat::AttachBufferQueue start streamId:%{public}d, hdiStreamId:%{public}d",
455 GetFwkStreamId(), GetHdiStreamId());
456 sptr<BufferProducerSequenceable> bufferProducerSequenceable;
457 CamRetCode rc;
458 {
459 std::lock_guard<std::mutex> lock(producerLock_);
460 bufferProducerSequenceable = new BufferProducerSequenceable(producer_);
461 }
462 rc = (CamRetCode)(streamOperator->AttachBufferQueue(GetHdiStreamId(), bufferProducerSequenceable));
463 CHECK_ERROR_PRINT_LOG(rc != HDI::Camera::V1_0::NO_ERROR,
464 "HStreamRepeat::AttachBufferQueue(), Failed to AttachBufferQueue %{public}d", rc);
465 MEDIA_INFO_LOG("HStreamRepeat::AddDeferredSurface end %{public}d", rc);
466 std::lock_guard<std::mutex> lock(movingPhotoCallbackLock_);
467 if (startMovingPhotoCallback_) {
468 startMovingPhotoCallback_();
469 startMovingPhotoCallback_ = nullptr;
470 }
471 return CAMERA_OK;
472 }
473
ForkSketchStreamRepeat(int32_t width,int32_t height,sptr<IStreamRepeat> & sketchStream,float sketchRatio)474 int32_t HStreamRepeat::ForkSketchStreamRepeat(
475 int32_t width, int32_t height, sptr<IStreamRepeat>& sketchStream, float sketchRatio)
476 {
477 CAMERA_SYNC_TRACE;
478 std::lock_guard<std::mutex> lock(sketchStreamLock_);
479 CHECK_ERROR_RETURN_RET_LOG(width <= 0 || height <= 0, CAMERA_INVALID_ARG,
480 "HCameraService::ForkSketchStreamRepeat args is illegal");
481 if (sketchStreamRepeat_ != nullptr) {
482 sketchStreamRepeat_->Release();
483 }
484
485 auto streamRepeat = new (std::nothrow) HStreamRepeat(nullptr, format_, width, height, RepeatStreamType::SKETCH);
486 CHECK_ERROR_RETURN_RET_LOG(streamRepeat == nullptr, CAMERA_ALLOC_ERROR,
487 "HStreamRepeat::ForkSketchStreamRepeat HStreamRepeat allocation failed");
488 MEDIA_DEBUG_LOG(
489 "HStreamRepeat::ForkSketchStreamRepeat para is:%{public}dx%{public}d,%{public}f", width, height, sketchRatio);
490 sketchStream = streamRepeat;
491 sketchStreamRepeat_ = streamRepeat;
492 sketchStreamRepeat_->sketchRatio_ = sketchRatio;
493 sketchStreamRepeat_->parentStreamRepeat_ = this;
494 MEDIA_INFO_LOG("HCameraService::ForkSketchStreamRepeat end");
495 return CAMERA_OK;
496 }
497
RemoveSketchStreamRepeat()498 int32_t HStreamRepeat::RemoveSketchStreamRepeat()
499 {
500 CAMERA_SYNC_TRACE;
501 std::lock_guard<std::mutex> lock(sketchStreamLock_);
502 if (sketchStreamRepeat_ == nullptr) {
503 return CAMERA_OK;
504 }
505 sketchStreamRepeat_->Release();
506 sketchStreamRepeat_->parentStreamRepeat_ = nullptr;
507 sketchStreamRepeat_ = nullptr;
508
509 return CAMERA_OK;
510 }
511
SetFrameRate(int32_t minFrameRate,int32_t maxFrameRate)512 int32_t HStreamRepeat::SetFrameRate(int32_t minFrameRate, int32_t maxFrameRate)
513 {
514 streamFrameRateRange_ = {minFrameRate, maxFrameRate};
515 std::vector<uint8_t> ability;
516 std::vector<uint8_t> repeatSettings;
517 CHECK_ERROR_RETURN_RET_LOG(cameraAbility_ == nullptr, CAMERA_DEVICE_DISCONNECT,
518 "HStreamRepeat::SetFrameRate cameraAbility_ is null");
519 {
520 std::lock_guard<std::mutex> lock(cameraAbilityLock_);
521 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(cameraAbility_, ability);
522 std::shared_ptr<OHOS::Camera::CameraMetadata> dynamicSetting = nullptr;
523 OHOS::Camera::MetadataUtils::ConvertVecToMetadata(ability, dynamicSetting);
524 if (dynamicSetting == nullptr) {
525 dynamicSetting = std::make_shared<OHOS::Camera::CameraMetadata>(0, 0);
526 }
527 CHECK_AND_RETURN_RET_LOG(dynamicSetting != nullptr, CAMERA_INVALID_ARG,
528 "HStreamRepeat::SetFrameRate dynamicSetting is nullptr.");
529 camera_metadata_item_t item;
530 int ret = OHOS::Camera::FindCameraMetadataItem(dynamicSetting->get(), OHOS_CONTROL_FPS_RANGES, &item);
531 bool status = false;
532 if (ret == CAM_META_ITEM_NOT_FOUND) {
533 MEDIA_DEBUG_LOG("HStreamRepeat::SetFrameRate Failed to find frame range");
534 status = dynamicSetting->addEntry(
535 OHOS_CONTROL_FPS_RANGES, streamFrameRateRange_.data(), streamFrameRateRange_.size());
536 } else if (ret == CAM_META_SUCCESS) {
537 MEDIA_DEBUG_LOG("HStreamRepeat::SetFrameRate success to find frame range");
538 status = dynamicSetting->updateEntry(
539 OHOS_CONTROL_FPS_RANGES, streamFrameRateRange_.data(), streamFrameRateRange_.size());
540 }
541 CHECK_ERROR_PRINT_LOG(!status, "HStreamRepeat::SetFrameRate Failed to set frame range");
542 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(dynamicSetting, repeatSettings);
543 }
544
545 auto streamOperator = GetStreamOperator();
546
547 CamRetCode rc = HDI::Camera::V1_0::NO_ERROR;
548 if (streamOperator != nullptr) {
549 std::lock_guard<std::mutex> startStopLock(streamStartStopLock_);
550 if (repeatStreamStatus_ == RepeatStreamStatus::STARTED) {
551 CaptureInfo captureInfo;
552 captureInfo.streamIds_ = {GetHdiStreamId()};
553 captureInfo.captureSetting_ = repeatSettings;
554 captureInfo.enableShutterCallback_ = false;
555 int32_t currentCaptureId = GetPreparedCaptureId();
556 MEDIA_INFO_LOG("HStreamRepeat::SetFramRate stream:%{public}d, with settingCapture ID:%{public}d",
557 GetFwkStreamId(), currentCaptureId);
558 rc = (CamRetCode)(streamOperator->Capture(currentCaptureId, captureInfo, true));
559 } else {
560 MEDIA_INFO_LOG("HStreamRepeat::SetFramRate stream The stream is not started. Save the parameters.");
561 }
562 CHECK_ERROR_PRINT_LOG(rc != HDI::Camera::V1_0::NO_ERROR,
563 "HStreamRepeat::SetFrameRate Failed with error Code:%{public}d", rc);
564 }
565 return rc;
566 }
567
SetMirror(bool isEnable)568 int32_t HStreamRepeat::SetMirror(bool isEnable)
569 {
570 enableMirror_ = isEnable;
571 return CAMERA_OK;
572 }
573
SetCameraRotation(bool isEnable,int32_t rotation)574 int32_t HStreamRepeat::SetCameraRotation(bool isEnable, int32_t rotation)
575 {
576 enableCameraRotation_ = isEnable;
577 CHECK_ERROR_RETURN_RET(rotation > STREAM_ROTATE_360, CAMERA_INVALID_ARG);
578 setCameraRotation_ = STREAM_ROTATE_360 - rotation;
579 SetStreamTransform();
580 return CAMERA_OK;
581 }
582
SetCameraApi(uint32_t apiCompatibleVersion)583 int32_t HStreamRepeat::SetCameraApi(uint32_t apiCompatibleVersion)
584 {
585 apiCompatibleVersion_ = apiCompatibleVersion;
586 return CAMERA_OK;
587 }
588
GetMirror(bool & isEnable)589 int32_t HStreamRepeat::GetMirror(bool& isEnable)
590 {
591 isEnable = enableMirror_;
592 return CAMERA_OK;
593 }
594
SetPreviewRotation(std::string & deviceClass)595 int32_t HStreamRepeat::SetPreviewRotation(std::string &deviceClass)
596 {
597 enableStreamRotate_ = true;
598 deviceClass_ = deviceClass;
599 return CAMERA_OK;
600 }
601
SetMirrorForLivePhoto(bool isEnable,int32_t mode)602 bool HStreamRepeat::SetMirrorForLivePhoto(bool isEnable, int32_t mode)
603 {
604 camera_metadata_item_t item;
605 const int32_t canMirrorVideoAndPhoto = 2;
606 int32_t res;
607 {
608 std::lock_guard<std::mutex> lock(cameraAbilityLock_);
609 CHECK_ERROR_RETURN_RET(cameraAbility_ == nullptr, false);
610 res = OHOS::Camera::FindCameraMetadataItem(cameraAbility_->get(),
611 OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED, &item);
612 }
613
614 bool isMirrorSupported = false;
615 if (res == CAM_META_SUCCESS) {
616 int step = 2;
617 for (int i = 0; i < static_cast<int>(item.count); i += step) {
618 MEDIA_DEBUG_LOG("mode u8[%{public}d]: %{public}d, u8[%{public}d], %{public}d",
619 i, item.data.u8[i], i + 1, item.data.u8[i + 1]);
620 if (mode == static_cast<int>(item.data.u8[i])) {
621 isMirrorSupported = (item.data.u8[i + 1] == canMirrorVideoAndPhoto) ? true : false;
622 }
623 }
624 }
625 if (isMirrorSupported) {
626 enableMirror_ = isEnable;
627 Start(nullptr, true);
628 } else {
629 MEDIA_ERR_LOG("HStreamRepeat::SetMirrorForLivePhoto not supported mirror with mode:%{public}d", mode);
630 }
631 return isMirrorSupported;
632 }
633
UpdateSketchRatio(float sketchRatio)634 int32_t HStreamRepeat::UpdateSketchRatio(float sketchRatio)
635 {
636 std::lock_guard<std::mutex> lock(sketchStreamLock_);
637 if (sketchStreamRepeat_ == nullptr) {
638 MEDIA_ERR_LOG("HCameraService::UpdateSketchRatio sketch stream not create!");
639 return CAMERA_INVALID_STATE;
640 }
641 sketchStreamRepeat_->sketchRatio_ = sketchRatio;
642 return CAMERA_OK;
643 }
644
GetSketchStream()645 sptr<HStreamRepeat> HStreamRepeat::GetSketchStream()
646 {
647 std::lock_guard<std::mutex> lock(sketchStreamLock_);
648 return sketchStreamRepeat_;
649 }
650
GetRepeatStreamType()651 RepeatStreamType HStreamRepeat::GetRepeatStreamType()
652 {
653 return repeatStreamType_;
654 }
655
DumpStreamInfo(CameraInfoDumper & infoDumper)656 void HStreamRepeat::DumpStreamInfo(CameraInfoDumper& infoDumper)
657 {
658 infoDumper.Title("repeat stream");
659 HStreamCommon::DumpStreamInfo(infoDumper);
660 }
661
SetStreamTransform(int disPlayRotation)662 void HStreamRepeat::SetStreamTransform(int disPlayRotation)
663 {
664 camera_metadata_item_t item;
665 int ret;
666 int32_t sensorOrientation;
667 camera_position_enum_t cameraPosition = OHOS_CAMERA_POSITION_BACK;
668 auto display = OHOS::Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
669 CHECK_ERROR_RETURN_LOG(display == nullptr,
670 "HStreamRepeat::SetStreamTransform GetDefaultDisplay failed");
671 {
672 std::lock_guard<std::mutex> lock(cameraAbilityLock_);
673 if (cameraAbility_ == nullptr) {
674 return;
675 }
676 ret = OHOS::Camera::FindCameraMetadataItem(cameraAbility_->get(), OHOS_SENSOR_ORIENTATION, &item);
677 CHECK_ERROR_RETURN_LOG(ret != CAM_META_SUCCESS,
678 "HStreamRepeat::SetStreamTransform get sensor orientation failed");
679 sensorOrientation = item.data.i32[0];
680 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform sensor orientation %{public}d", sensorOrientation);
681
682 ret = OHOS::Camera::FindCameraMetadataItem(cameraAbility_->get(), OHOS_ABILITY_CAMERA_POSITION, &item);
683 CHECK_ERROR_RETURN_LOG(ret != CAM_META_SUCCESS,
684 "HStreamRepeat::SetStreamTransform get camera position failed");
685 cameraPosition = static_cast<camera_position_enum_t>(item.data.u8[0]);
686 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform camera position: %{public}d", cameraPosition);
687 }
688 if (cameraUsedAsPosition_ != OHOS_CAMERA_POSITION_OTHER) {
689 cameraPosition = cameraUsedAsPosition_;
690 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform used camera position: %{public}d", cameraPosition);
691 }
692 if (enableCameraRotation_ && sensorOrientation != 0) {
693 ProcessCameraSetRotation(sensorOrientation, cameraPosition);
694 }
695 if (apiCompatibleVersion_ >= CAMERA_API_VERSION_BASE) {
696 ProcessVerticalCameraPosition(sensorOrientation, cameraPosition);
697 return;
698 }
699 std::lock_guard<std::mutex> lock(producerLock_);
700 if (producer_ == nullptr) {
701 MEDIA_ERR_LOG("HStreamRepeat::SetStreamTransform failed, producer is null or GetDefaultDisplay failed");
702 return;
703 }
704 int mOritation = disPlayRotation;
705 if (enableStreamRotate_) {
706 if (mOritation == -1) {
707 CHECK_ERROR_RETURN_LOG(producer_ == nullptr || display == nullptr,
708 "HStreamRepeat::SetStreamTransform failed, producer is null or GetDefaultDisplay failed");
709 mOritation = static_cast<int>(display->GetRotation());
710 }
711 int32_t streamRotation = GetStreamRotation(sensorOrientation, cameraPosition, mOritation, deviceClass_);
712 ProcessCameraPosition(streamRotation, cameraPosition);
713 } else {
714 ProcessFixedTransform(sensorOrientation, cameraPosition);
715 }
716 }
717
ProcessFixedTransform(int32_t & sensorOrientation,camera_position_enum_t & cameraPosition)718 void HStreamRepeat::ProcessFixedTransform(int32_t& sensorOrientation, camera_position_enum_t& cameraPosition)
719 {
720 if (enableCameraRotation_) {
721 ProcessVerticalCameraPosition(sensorOrientation, cameraPosition);
722 return;
723 }
724 bool isTableFlag = system::GetBoolParameter("const.multimedia.enable_camera_rotation_compensation", 0);
725 bool isNeedChangeRotation = system::GetBoolParameter("const.multimedia.enable_camera_rotation_change", 0);
726 if (isTableFlag) {
727 ProcessFixedDiffDeviceTransform(cameraPosition);
728 return;
729 }
730 if (isNeedChangeRotation) {
731 ProcessVerticalCameraPosition(sensorOrientation, cameraPosition);
732 return;
733 }
734 if (IsVerticalDevice()) {
735 ProcessVerticalCameraPosition(sensorOrientation, cameraPosition);
736 } else {
737 ProcessFixedDiffDeviceTransform(cameraPosition);
738 }
739 }
740
ProcessFixedDiffDeviceTransform(camera_position_enum_t & cameraPosition)741 void HStreamRepeat::ProcessFixedDiffDeviceTransform(camera_position_enum_t& cameraPosition)
742 {
743 int ret = SurfaceError::SURFACE_ERROR_OK;
744 if (cameraPosition == OHOS_CAMERA_POSITION_FRONT) {
745 ret = producer_->SetTransform(GRAPHIC_FLIP_H);
746 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform filp for wide side devices");
747 } else {
748 ret = producer_->SetTransform(GRAPHIC_ROTATE_NONE);
749 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform none rotate");
750 }
751 if (ret != SurfaceError::SURFACE_ERROR_OK) {
752 MEDIA_ERR_LOG("HStreamRepeat::ProcessFixedTransform failed %{public}d", ret);
753 }
754 }
755
ProcessCameraSetRotation(int32_t & sensorOrientation,camera_position_enum_t & cameraPosition)756 void HStreamRepeat::ProcessCameraSetRotation(int32_t& sensorOrientation, camera_position_enum_t& cameraPosition)
757 {
758 sensorOrientation = STREAM_ROTATE_360 - setCameraRotation_;
759 if (cameraPosition == OHOS_CAMERA_POSITION_FRONT) {
760 sensorOrientation = (sensorOrientation == STREAM_ROTATE_180) ? GRAPHIC_ROTATE_NONE : (sensorOrientation == 0) ?
761 STREAM_ROTATE_180 : sensorOrientation;
762 }
763 if (sensorOrientation == GRAPHIC_ROTATE_NONE) {
764 int ret = producer_->SetTransform(GRAPHIC_ROTATE_NONE);
765 MEDIA_ERR_LOG("HStreamRepeat::CameraSetRotation failed %{public}d", ret);
766 }
767 }
768
ProcessVerticalCameraPosition(int32_t & sensorOrientation,camera_position_enum_t & cameraPosition)769 void HStreamRepeat::ProcessVerticalCameraPosition(int32_t& sensorOrientation, camera_position_enum_t& cameraPosition)
770 {
771 int ret = SurfaceError::SURFACE_ERROR_OK;
772 int32_t streamRotation = sensorOrientation;
773 if (cameraPosition == OHOS_CAMERA_POSITION_FRONT) {
774 switch (streamRotation) {
775 case STREAM_ROTATE_0: {
776 ret = producer_->SetTransform(GRAPHIC_FLIP_H);
777 break;
778 }
779 case STREAM_ROTATE_90: {
780 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT90);
781 break;
782 }
783 case STREAM_ROTATE_180: {
784 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT180);
785 break;
786 }
787 case STREAM_ROTATE_270: {
788 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT270);
789 break;
790 }
791 default: {
792 break;
793 }
794 }
795 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform filp rotate %{public}d", streamRotation);
796 } else {
797 streamRotation = STREAM_ROTATE_360 - sensorOrientation;
798 switch (streamRotation) {
799 case STREAM_ROTATE_0: {
800 ret = producer_->SetTransform(GRAPHIC_ROTATE_NONE);
801 break;
802 }
803 case STREAM_ROTATE_90: {
804 ret = producer_->SetTransform(GRAPHIC_ROTATE_90);
805 break;
806 }
807 case STREAM_ROTATE_180: {
808 ret = producer_->SetTransform(GRAPHIC_ROTATE_180);
809 break;
810 }
811 case STREAM_ROTATE_270: {
812 ret = producer_->SetTransform(GRAPHIC_ROTATE_270);
813 break;
814 }
815 default: {
816 break;
817 }
818 }
819 MEDIA_INFO_LOG("HStreamRepeat::ProcessVerticalCameraPosition not flip rotate %{public}d", streamRotation);
820 }
821 CHECK_ERROR_PRINT_LOG(ret != SurfaceError::SURFACE_ERROR_OK,
822 "HStreamRepeat::ProcessVerticalCameraPosition failed %{public}d", ret);
823 }
824
ProcessCameraPosition(int32_t & streamRotation,camera_position_enum_t & cameraPosition)825 void HStreamRepeat::ProcessCameraPosition(int32_t& streamRotation, camera_position_enum_t& cameraPosition)
826 {
827 int ret = SurfaceError::SURFACE_ERROR_OK;
828 if (cameraPosition == OHOS_CAMERA_POSITION_FRONT) {
829 switch (streamRotation) {
830 case STREAM_ROTATE_0: {
831 ret = producer_->SetTransform(GRAPHIC_FLIP_H);
832 break;
833 }
834 case STREAM_ROTATE_90: {
835 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT90);
836 break;
837 }
838 case STREAM_ROTATE_180: {
839 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT180);
840 break;
841 }
842 case STREAM_ROTATE_270: {
843 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT270);
844 break;
845 }
846 default: {
847 break;
848 }
849 }
850 } else {
851 switch (streamRotation) {
852 case STREAM_ROTATE_0: {
853 ret = producer_->SetTransform(GRAPHIC_ROTATE_NONE);
854 break;
855 }
856 case STREAM_ROTATE_90: {
857 ret = producer_->SetTransform(GRAPHIC_ROTATE_90);
858 break;
859 }
860 case STREAM_ROTATE_180: {
861 ret = producer_->SetTransform(GRAPHIC_ROTATE_180);
862 break;
863 }
864 case STREAM_ROTATE_270: {
865 ret = producer_->SetTransform(GRAPHIC_ROTATE_270);
866 break;
867 }
868 default: {
869 break;
870 }
871 }
872 }
873 CHECK_ERROR_PRINT_LOG(ret != SurfaceError::SURFACE_ERROR_OK,
874 "HStreamRepeat::ProcessCameraPosition failed %{public}d", ret);
875 }
876
OperatePermissionCheck(uint32_t interfaceCode)877 int32_t HStreamRepeat::OperatePermissionCheck(uint32_t interfaceCode)
878 {
879 switch (static_cast<StreamRepeatInterfaceCode>(interfaceCode)) {
880 case CAMERA_START_VIDEO_RECORDING:
881 case CAMERA_FORK_SKETCH_STREAM_REPEAT: {
882 auto callerToken = IPCSkeleton::GetCallingTokenID();
883 if (callerToken_ != callerToken) {
884 MEDIA_ERR_LOG("HStreamRepeat::OperatePermissionCheck fail, callerToken not legal");
885 return CAMERA_OPERATION_NOT_ALLOWED;
886 }
887 break;
888 }
889 default:
890 break;
891 }
892 return CAMERA_OK;
893 }
894
OpenVideoDfxSwitch(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)895 void HStreamRepeat::OpenVideoDfxSwitch(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)
896 {
897 bool status = false;
898 camera_metadata_item_t item;
899 uint8_t dfxSwitch = true;
900 CHECK_ERROR_RETURN_LOG(settings == nullptr, "HStreamRepeat::OpenVideoDfxSwitch fail, setting is null!");
901 int32_t ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_VIDEO_DEBUG_SWITCH, &item);
902 if (ret == CAM_META_ITEM_NOT_FOUND) {
903 status = settings->addEntry(OHOS_CONTROL_VIDEO_DEBUG_SWITCH, &dfxSwitch, 1);
904 MEDIA_INFO_LOG("HStreamRepeat::OpenVideoDfxSwitch success!");
905 } else {
906 status = true;
907 }
908 CHECK_ERROR_PRINT_LOG(!status, "HStreamRepeat::OpenVideoDfxSwitch fail!");
909 }
910
EnableSecure(bool isEnabled)911 int32_t HStreamRepeat::EnableSecure(bool isEnabled)
912 {
913 mEnableSecure = isEnabled;
914 return CAMERA_OK;
915 }
916
UpdateVideoSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)917 void HStreamRepeat::UpdateVideoSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)
918 {
919 CHECK_AND_RETURN_LOG(settings != nullptr, "HStreamRepeat::UpdateVideoSettings settings is nullptr");
920 bool status = false;
921 camera_metadata_item_t item;
922
923 uint8_t mirror = enableMirror_;
924 MEDIA_DEBUG_LOG("HStreamRepeat::UpdateVideoSettings set Mirror %{public}d", mirror);
925 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_CAPTURE_MIRROR, &item);
926 if (ret == CAM_META_ITEM_NOT_FOUND) {
927 status = settings->addEntry(OHOS_CONTROL_CAPTURE_MIRROR, &mirror, 1);
928 } else if (ret == CAM_META_SUCCESS) {
929 status = settings->updateEntry(OHOS_CONTROL_CAPTURE_MIRROR, &mirror, 1);
930 }
931 CHECK_ERROR_PRINT_LOG(!status, "UpdateVideoSettings Failed to set mirroring in VideoSettings");
932 }
933
UpdateFrameRateSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)934 void HStreamRepeat::UpdateFrameRateSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)
935 {
936 CHECK_ERROR_RETURN(settings == nullptr);
937 bool status = false;
938 camera_metadata_item_t item;
939
940 if (streamFrameRateRange_.size() != 0) {
941 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_FPS_RANGES, &item);
942 if (ret == CAM_META_ITEM_NOT_FOUND) {
943 MEDIA_DEBUG_LOG("HStreamRepeat::SetFrameRate Failed to find frame range");
944 status = settings->addEntry(
945 OHOS_CONTROL_FPS_RANGES, streamFrameRateRange_.data(), streamFrameRateRange_.size());
946 } else if (ret == CAM_META_SUCCESS) {
947 MEDIA_DEBUG_LOG("HStreamRepeat::SetFrameRate success to find frame range");
948 status = settings->updateEntry(
949 OHOS_CONTROL_FPS_RANGES, streamFrameRateRange_.data(), streamFrameRateRange_.size());
950 }
951 CHECK_ERROR_PRINT_LOG(!status, "HStreamRepeat::SetFrameRate Failed to set frame range");
952 }
953 }
954
UpdateFrameMuteSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> & settings,std::shared_ptr<OHOS::Camera::CameraMetadata> & dynamicSetting)955 void HStreamRepeat::UpdateFrameMuteSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> &settings,
956 std::shared_ptr<OHOS::Camera::CameraMetadata> &dynamicSetting)
957 {
958 CHECK_ERROR_RETURN(settings == nullptr);
959 bool status = false;
960 camera_metadata_item_t item;
961 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_MUTE_MODE, &item);
962 if (ret == CAM_META_ITEM_NOT_FOUND) {
963 return;
964 }
965 auto mode = item.data.u8[0];
966 int32_t count = 1;
967 CHECK_ERROR_RETURN_LOG(dynamicSetting == nullptr, "dynamicSetting is nullptr");
968 ret = OHOS::Camera::FindCameraMetadataItem(dynamicSetting->get(), OHOS_CONTROL_MUTE_MODE, &item);
969 if (ret == CAM_META_SUCCESS) {
970 status = dynamicSetting->updateEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
971 } else {
972 status = dynamicSetting->addEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
973 }
974 CHECK_ERROR_PRINT_LOG(!status, "HStreamRepeat::UpdateFrameMuteSettings Failed to set frame mute");
975 }
976
977 #ifdef NOTIFICATION_ENABLE
UpdateBeautySettings(std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)978 void HStreamRepeat::UpdateBeautySettings(std::shared_ptr<OHOS::Camera::CameraMetadata> &settings)
979 {
980 CHECK_ERROR_RETURN_LOG(settings == nullptr, "HStreamRepeat::UpdateBeautySettings settings is nullptr");
981 MEDIA_INFO_LOG("HStreamRepeat::UpdateBeautySettings enter");
982 bool status = false;
983 camera_metadata_item_t item;
984 int32_t count = 1;
985 uint8_t beautyType = OHOS_CAMERA_BEAUTY_TYPE_AUTO;
986 uint8_t beautyLevel = BEAUTY_LEVEL;
987
988 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
989 if (ret == CAM_META_ITEM_NOT_FOUND) {
990 status = settings->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beautyType, count);
991 } else if (ret == CAM_META_SUCCESS) {
992 MEDIA_DEBUG_LOG("HStreamRepeat::SetFrameRate success to find frame range");
993 status = settings->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beautyType, count);
994 }
995 CHECK_ERROR_PRINT_LOG(!status, "HStreamRepeat::SetFrameRate Failed to set beauty type");
996
997 ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_BEAUTY_AUTO_VALUE, &item);
998 if (ret == CAM_META_ITEM_NOT_FOUND) {
999 status = settings->addEntry(OHOS_CONTROL_BEAUTY_AUTO_VALUE, &beautyLevel, count);
1000 } else if (ret == CAM_META_SUCCESS) {
1001 status = settings->updateEntry(OHOS_CONTROL_BEAUTY_AUTO_VALUE, &beautyLevel, count);
1002 }
1003 CHECK_ERROR_PRINT_LOG(!status, "HStreamRepeat::SetFrameRate Failed to set beauty level");
1004 }
1005
CancelNotification()1006 void HStreamRepeat::CancelNotification()
1007 {
1008 if (!IsNeedBeautyNotification()) {
1009 return;
1010 }
1011 CameraBeautyNotification::GetInstance()->CancelNotification();
1012 }
1013
IsNeedBeautyNotification()1014 bool HStreamRepeat::IsNeedBeautyNotification()
1015 {
1016 bool ret = false;
1017 int uid = IPCSkeleton::GetCallingUid();
1018 std::string bundleName = GetClientBundle(uid);
1019 if (streamFrameRateRange_.size() == 0) {
1020 return ret;
1021 }
1022 std::string notificationInfo = system::GetParameter("const.camera.notification_info", "");
1023 if (notificationInfo.empty()) {
1024 return ret;
1025 }
1026 std::vector<std::string> result = SplitString(notificationInfo, '|');
1027 std::string configBundleName = result[0];
1028 int32_t configMinFPS = std::atoi(result[1].c_str());
1029 int32_t configMAXFPS = std::atoi(result[2].c_str());
1030 return configBundleName == bundleName && configMinFPS == streamFrameRateRange_[0] &&
1031 configMAXFPS == streamFrameRateRange_[1];
1032 }
1033 #endif
1034
AttachMetaSurface(const sptr<OHOS::IBufferProducer> & producer,int32_t videoMetaType)1035 int32_t HStreamRepeat::AttachMetaSurface(const sptr<OHOS::IBufferProducer>& producer, int32_t videoMetaType)
1036 {
1037 MEDIA_INFO_LOG("HStreamRepeat::AttachMetaSurface called");
1038 {
1039 CHECK_ERROR_RETURN_RET_LOG(producer == nullptr, CAMERA_INVALID_ARG,
1040 "HStreamRepeat::AttachMetaSurface producer is null");
1041 metaSurfaceBufferQueue_ = new BufferProducerSequenceable(producer);
1042 }
1043 return CAMERA_OK;
1044 }
1045 } // namespace CameraStandard
1046 } // namespace OHOS
1047