• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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