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