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