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
SetMirrorForLivePhoto(bool isEnable, int32_t mode)549 void HStreamRepeat::SetMirrorForLivePhoto(bool isEnable, int32_t mode)
550 {
551 camera_metadata_item_t item;
552 const int32_t canMirrorVideoAndPhoto = 2;
553 int32_t res;
554 {
555 std::lock_guard<std::mutex> lock(cameraAbilityLock_);
556 CHECK_ERROR_RETURN(cameraAbility_ == nullptr);
557 res = OHOS::Camera::FindCameraMetadataItem(cameraAbility_->get(),
558 OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED, &item);
559 }
560
561 bool isMirrorSupported = false;
562 if (res == CAM_META_SUCCESS) {
563 int step = 2;
564 for (int i = 0; i < static_cast<int>(item.count); i += step) {
565 MEDIA_DEBUG_LOG("mode u8[%{public}d]: %{public}d, u8[%{public}d], %{public}d",
566 i, item.data.u8[i], i + 1, item.data.u8[i + 1]);
567 if (mode == static_cast<int>(item.data.u8[i])) {
568 isMirrorSupported = (item.data.u8[i + 1] == canMirrorVideoAndPhoto) ? true : false;
569 }
570 }
571 }
572 if (isMirrorSupported) {
573 enableMirror_ = isEnable;
574 } else {
575 MEDIA_ERR_LOG("HStreamRepeat::SetMirrorForLivePhoto not supported mirror with mode:%{public}d", mode);
576 }
577 Start(nullptr, true);
578 }
579
SetCameraRotation(bool isEnable, int32_t rotation)580 int32_t HStreamRepeat::SetCameraRotation(bool isEnable, int32_t rotation)
581 {
582 enableCameraRotation_ = isEnable;
583 CHECK_ERROR_RETURN_RET(rotation > STREAM_ROTATE_360, CAMERA_INVALID_ARG);
584 setCameraRotation_ = STREAM_ROTATE_360 - rotation;
585 SetStreamTransform();
586 return CAMERA_OK;
587 }
588
SetPreviewRotation(std::string &deviceClass)589 int32_t HStreamRepeat::SetPreviewRotation(std::string &deviceClass)
590 {
591 enableStreamRotate_ = true;
592 deviceClass_ = deviceClass;
593 return CAMERA_OK;
594 }
595
UpdateSketchRatio(float sketchRatio)596 int32_t HStreamRepeat::UpdateSketchRatio(float sketchRatio)
597 {
598 std::lock_guard<std::mutex> lock(sketchStreamLock_);
599 if (sketchStreamRepeat_ == nullptr) {
600 MEDIA_ERR_LOG("HCameraService::UpdateSketchRatio sketch stream not create!");
601 return CAMERA_INVALID_STATE;
602 }
603 sketchStreamRepeat_->sketchRatio_ = sketchRatio;
604 return CAMERA_OK;
605 }
606
GetSketchStream()607 sptr<HStreamRepeat> HStreamRepeat::GetSketchStream()
608 {
609 std::lock_guard<std::mutex> lock(sketchStreamLock_);
610 return sketchStreamRepeat_;
611 }
612
GetRepeatStreamType()613 RepeatStreamType HStreamRepeat::GetRepeatStreamType()
614 {
615 return repeatStreamType_;
616 }
617
DumpStreamInfo(CameraInfoDumper& infoDumper)618 void HStreamRepeat::DumpStreamInfo(CameraInfoDumper& infoDumper)
619 {
620 infoDumper.Title("repeat stream");
621 HStreamCommon::DumpStreamInfo(infoDumper);
622 }
623
SetStreamTransform(int disPlayRotation)624 void HStreamRepeat::SetStreamTransform(int disPlayRotation)
625 {
626 camera_metadata_item_t item;
627 int ret;
628 int32_t sensorOrientation;
629 camera_position_enum_t cameraPosition = OHOS_CAMERA_POSITION_BACK;
630 auto display = OHOS::Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
631 CHECK_ERROR_RETURN_LOG(display == nullptr,
632 "HStreamRepeat::SetStreamTransform GetDefaultDisplay failed");
633 {
634 std::lock_guard<std::mutex> lock(cameraAbilityLock_);
635 if (cameraAbility_ == nullptr) {
636 return;
637 }
638 ret = OHOS::Camera::FindCameraMetadataItem(cameraAbility_->get(), OHOS_SENSOR_ORIENTATION, &item);
639 CHECK_ERROR_RETURN_LOG(ret != CAM_META_SUCCESS,
640 "HStreamRepeat::SetStreamTransform get sensor orientation failed");
641 sensorOrientation = item.data.i32[0];
642 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform sensor orientation %{public}d", sensorOrientation);
643
644 ret = OHOS::Camera::FindCameraMetadataItem(cameraAbility_->get(), OHOS_ABILITY_CAMERA_POSITION, &item);
645 CHECK_ERROR_RETURN_LOG(ret != CAM_META_SUCCESS,
646 "HStreamRepeat::SetStreamTransform get camera position failed");
647 cameraPosition = static_cast<camera_position_enum_t>(item.data.u8[0]);
648 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform camera position %{public}d", cameraPosition);
649 }
650 if (cameraUsedAsPosition_ != OHOS_CAMERA_POSITION_OTHER) {
651 cameraPosition = cameraUsedAsPosition_;
652 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform used camera position as %{public}d", cameraPosition);
653 }
654 if (enableCameraRotation_) {
655 ProcessCameraSetRotation(sensorOrientation, cameraPosition);
656 }
657 std::lock_guard<std::mutex> lock(producerLock_);
658 if (producer_ == nullptr) {
659 MEDIA_ERR_LOG("HStreamRepeat::SetStreamTransform failed, producer is null or GetDefaultDisplay failed");
660 return;
661 }
662 int mOritation = disPlayRotation;
663 if (enableStreamRotate_) {
664 if (mOritation == -1) {
665 CHECK_ERROR_RETURN_LOG(producer_ == nullptr || display == nullptr,
666 "HStreamRepeat::SetStreamTransform failed, producer is null or GetDefaultDisplay failed");
667 mOritation = static_cast<int>(display->GetRotation());
668 }
669 int32_t streamRotation = GetStreamRotation(sensorOrientation, cameraPosition, mOritation, deviceClass_);
670 ProcessCameraPosition(streamRotation, cameraPosition);
671 } else {
672 ProcessVerticalCameraPosition(sensorOrientation, cameraPosition);
673 }
674 }
675
ProcessCameraSetRotation(int32_t& sensorOrientation, camera_position_enum_t& cameraPosition)676 void HStreamRepeat::ProcessCameraSetRotation(int32_t& sensorOrientation, camera_position_enum_t& cameraPosition)
677 {
678 sensorOrientation = STREAM_ROTATE_360 - setCameraRotation_;
679 if (cameraPosition == OHOS_CAMERA_POSITION_FRONT) {
680 sensorOrientation = (sensorOrientation == STREAM_ROTATE_180) ? STREAM_ROTATE_0 :
681 (sensorOrientation == STREAM_ROTATE_0) ? STREAM_ROTATE_180 : sensorOrientation;
682 }
683 if (sensorOrientation == STREAM_ROTATE_0) {
684 int ret = producer_->SetTransform(GRAPHIC_ROTATE_NONE);
685 MEDIA_ERR_LOG("HStreamRepeat::ProcessCameraSetRotation %{public}d", ret);
686 }
687 }
688
ProcessVerticalCameraPosition(int32_t& sensorOrientation, camera_position_enum_t& cameraPosition)689 void HStreamRepeat::ProcessVerticalCameraPosition(int32_t& sensorOrientation, camera_position_enum_t& cameraPosition)
690 {
691 int ret = SurfaceError::SURFACE_ERROR_OK;
692 int32_t streamRotation = sensorOrientation;
693 if (cameraPosition == OHOS_CAMERA_POSITION_FRONT) {
694 switch (streamRotation) {
695 case STREAM_ROTATE_0: {
696 ret = producer_->SetTransform(GRAPHIC_FLIP_H);
697 break;
698 }
699 case STREAM_ROTATE_90: {
700 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT90);
701 break;
702 }
703 case STREAM_ROTATE_180: {
704 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT180);
705 break;
706 }
707 case STREAM_ROTATE_270: {
708 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT270);
709 break;
710 }
711 default: {
712 break;
713 }
714 }
715 MEDIA_INFO_LOG("HStreamRepeat::SetStreamTransform filp rotate %{public}d", streamRotation);
716 } else {
717 streamRotation = STREAM_ROTATE_360 - sensorOrientation;
718 switch (streamRotation) {
719 case STREAM_ROTATE_0: {
720 ret = producer_->SetTransform(GRAPHIC_ROTATE_NONE);
721 break;
722 }
723 case STREAM_ROTATE_90: {
724 ret = producer_->SetTransform(GRAPHIC_ROTATE_90);
725 break;
726 }
727 case STREAM_ROTATE_180: {
728 ret = producer_->SetTransform(GRAPHIC_ROTATE_180);
729 break;
730 }
731 case STREAM_ROTATE_270: {
732 ret = producer_->SetTransform(GRAPHIC_ROTATE_270);
733 break;
734 }
735 default: {
736 break;
737 }
738 }
739 MEDIA_INFO_LOG("HStreamRepeat::ProcessVerticalCameraPosition not flip rotate %{public}d", streamRotation);
740 }
741 CHECK_ERROR_PRINT_LOG(ret != SurfaceError::SURFACE_ERROR_OK,
742 "HStreamRepeat::ProcessVerticalCameraPosition failed %{public}d", ret);
743 }
744
ProcessCameraPosition(int32_t& streamRotation, camera_position_enum_t& cameraPosition)745 void HStreamRepeat::ProcessCameraPosition(int32_t& streamRotation, camera_position_enum_t& cameraPosition)
746 {
747 int ret = SurfaceError::SURFACE_ERROR_OK;
748 if (cameraPosition == OHOS_CAMERA_POSITION_FRONT) {
749 switch (streamRotation) {
750 case STREAM_ROTATE_0: {
751 ret = producer_->SetTransform(GRAPHIC_FLIP_H);
752 break;
753 }
754 case STREAM_ROTATE_90: {
755 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT90);
756 break;
757 }
758 case STREAM_ROTATE_180: {
759 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT180);
760 break;
761 }
762 case STREAM_ROTATE_270: {
763 ret = producer_->SetTransform(GRAPHIC_FLIP_H_ROT270);
764 break;
765 }
766 default: {
767 break;
768 }
769 }
770 } else {
771 switch (streamRotation) {
772 case STREAM_ROTATE_0: {
773 ret = producer_->SetTransform(GRAPHIC_ROTATE_NONE);
774 break;
775 }
776 case STREAM_ROTATE_90: {
777 ret = producer_->SetTransform(GRAPHIC_ROTATE_90);
778 break;
779 }
780 case STREAM_ROTATE_180: {
781 ret = producer_->SetTransform(GRAPHIC_ROTATE_180);
782 break;
783 }
784 case STREAM_ROTATE_270: {
785 ret = producer_->SetTransform(GRAPHIC_ROTATE_270);
786 break;
787 }
788 default: {
789 break;
790 }
791 }
792 }
793 CHECK_ERROR_PRINT_LOG(ret != SurfaceError::SURFACE_ERROR_OK,
794 "HStreamRepeat::ProcessCameraPosition failed %{public}d", ret);
795 }
796
OperatePermissionCheck(uint32_t interfaceCode)797 int32_t HStreamRepeat::OperatePermissionCheck(uint32_t interfaceCode)
798 {
799 switch (static_cast<StreamRepeatInterfaceCode>(interfaceCode)) {
800 case CAMERA_START_VIDEO_RECORDING:
801 case CAMERA_FORK_SKETCH_STREAM_REPEAT: {
802 auto callerToken = IPCSkeleton::GetCallingTokenID();
803 if (callerToken_ != callerToken) {
804 MEDIA_ERR_LOG("HStreamRepeat::OperatePermissionCheck fail, callerToken_ is : %{public}d, now token "
805 "is %{public}d",
806 callerToken_, callerToken);
807 return CAMERA_OPERATION_NOT_ALLOWED;
808 }
809 break;
810 }
811 default:
812 break;
813 }
814 return CAMERA_OK;
815 }
816
OpenVideoDfxSwitch(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)817 void HStreamRepeat::OpenVideoDfxSwitch(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)
818 {
819 bool status = false;
820 camera_metadata_item_t item;
821 uint8_t dfxSwitch = true;
822 CHECK_ERROR_RETURN_LOG(settings == nullptr, "HStreamRepeat::OpenVideoDfxSwitch fail, setting is null!");
823 int32_t ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_VIDEO_DEBUG_SWITCH, &item);
824 if (ret == CAM_META_ITEM_NOT_FOUND) {
825 status = settings->addEntry(OHOS_CONTROL_VIDEO_DEBUG_SWITCH, &dfxSwitch, 1);
826 MEDIA_INFO_LOG("HStreamRepeat::OpenVideoDfxSwitch success!");
827 } else {
828 status = true;
829 }
830 CHECK_ERROR_PRINT_LOG(!status, "HStreamRepeat::OpenVideoDfxSwitch fail!");
831 }
832
EnableSecure(bool isEnabled)833 int32_t HStreamRepeat::EnableSecure(bool isEnabled)
834 {
835 mEnableSecure = isEnabled;
836 return CAMERA_OK;
837 }
838
UpdateVideoSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)839 void HStreamRepeat::UpdateVideoSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)
840 {
841 CHECK_AND_RETURN_LOG(settings != nullptr, "HStreamRepeat::UpdateVideoSettings settings is nullptr");
842 bool status = false;
843 camera_metadata_item_t item;
844
845 uint8_t mirror = enableMirror_;
846 MEDIA_DEBUG_LOG("HStreamRepeat::UpdateVideoSettings set Mirror %{public}d", mirror);
847 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_CAPTURE_MIRROR, &item);
848 if (ret == CAM_META_ITEM_NOT_FOUND) {
849 status = settings->addEntry(OHOS_CONTROL_CAPTURE_MIRROR, &mirror, 1);
850 } else if (ret == CAM_META_SUCCESS) {
851 status = settings->updateEntry(OHOS_CONTROL_CAPTURE_MIRROR, &mirror, 1);
852 }
853 CHECK_ERROR_PRINT_LOG(!status, "UpdateVideoSettings Failed to set mirroring in VideoSettings");
854 }
855
UpdateFrameRateSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)856 void HStreamRepeat::UpdateFrameRateSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> settings)
857 {
858 CHECK_ERROR_RETURN(settings == nullptr);
859 bool status = false;
860 camera_metadata_item_t item;
861
862 if (streamFrameRateRange_.size() != 0) {
863 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_FPS_RANGES, &item);
864 if (ret == CAM_META_ITEM_NOT_FOUND) {
865 MEDIA_DEBUG_LOG("HStreamRepeat::SetFrameRate Failed to find frame range");
866 status = settings->addEntry(
867 OHOS_CONTROL_FPS_RANGES, streamFrameRateRange_.data(), streamFrameRateRange_.size());
868 } else if (ret == CAM_META_SUCCESS) {
869 MEDIA_DEBUG_LOG("HStreamRepeat::SetFrameRate success to find frame range");
870 status = settings->updateEntry(
871 OHOS_CONTROL_FPS_RANGES, streamFrameRateRange_.data(), streamFrameRateRange_.size());
872 }
873 CHECK_ERROR_PRINT_LOG(!status, "HStreamRepeat::SetFrameRate Failed to set frame range");
874 }
875 }
876
UpdateFrameMuteSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> &settings, std::shared_ptr<OHOS::Camera::CameraMetadata> &dynamicSetting)877 void HStreamRepeat::UpdateFrameMuteSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> &settings,
878 std::shared_ptr<OHOS::Camera::CameraMetadata> &dynamicSetting)
879 {
880 CHECK_ERROR_RETURN(settings == nullptr);
881 bool status = false;
882 camera_metadata_item_t item;
883 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_MUTE_MODE, &item);
884 if (ret == CAM_META_ITEM_NOT_FOUND) {
885 return;
886 }
887 auto mode = item.data.u8[0];
888 int32_t count = 1;
889 CHECK_ERROR_RETURN_LOG(dynamicSetting == nullptr, "dynamicSetting is nullptr");
890 ret = OHOS::Camera::FindCameraMetadataItem(dynamicSetting->get(), OHOS_CONTROL_MUTE_MODE, &item);
891 if (ret == CAM_META_SUCCESS) {
892 status = dynamicSetting->updateEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
893 } else {
894 status = dynamicSetting->addEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
895 }
896 CHECK_ERROR_PRINT_LOG(!status, "HStreamRepeat::UpdateFrameMuteSettings Failed to set frame mute");
897 }
898
AttachMetaSurface(const sptr<OHOS::IBufferProducer>& producer, int32_t videoMetaType)899 int32_t HStreamRepeat::AttachMetaSurface(const sptr<OHOS::IBufferProducer>& producer, int32_t videoMetaType)
900 {
901 MEDIA_INFO_LOG("HStreamRepeat::AttachMetaSurface called");
902 {
903 CHECK_ERROR_RETURN_RET_LOG(producer == nullptr, CAMERA_INVALID_ARG,
904 "HStreamRepeat::AttachMetaSurface producer is null");
905 metaSurfaceBufferQueue_ = new BufferProducerSequenceable(producer);
906 }
907 return CAMERA_OK;
908 }
909 } // namespace CameraStandard
910 } // namespace OHOS
911