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