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