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