1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file expected in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci#include "double_preview_test.h"
16094332d3Sopenharmony_ci
17094332d3Sopenharmony_ciusing namespace testing::ext;
18094332d3Sopenharmony_ciconstexpr uint32_t TIME_FOR_WAIT_CANCEL_CAPTURE = 2;
19094332d3Sopenharmony_ci
20094332d3Sopenharmony_civoid DoublePreviewTest::SetUpTestCase(void)
21094332d3Sopenharmony_ci{}
22094332d3Sopenharmony_civoid DoublePreviewTest::TearDownTestCase(void)
23094332d3Sopenharmony_ci{}
24094332d3Sopenharmony_civoid DoublePreviewTest::SetUp(void)
25094332d3Sopenharmony_ci{
26094332d3Sopenharmony_ci    if (cameraBase_ == nullptr) {
27094332d3Sopenharmony_ci        cameraBase_ = std::make_shared<TestCameraBase>();
28094332d3Sopenharmony_ci    }
29094332d3Sopenharmony_ci    cameraBase_->Init();
30094332d3Sopenharmony_ci}
31094332d3Sopenharmony_civoid DoublePreviewTest::TearDown(void)
32094332d3Sopenharmony_ci{
33094332d3Sopenharmony_ci    cameraBase_->Close();
34094332d3Sopenharmony_ci}
35094332d3Sopenharmony_ci
36094332d3Sopenharmony_civoid DoublePreviewTest::SetStreamInfo(StreamInfo &streamInfo,
37094332d3Sopenharmony_ci    const std::shared_ptr<StreamCustomer> &streamCustomer,
38094332d3Sopenharmony_ci    const int streamId, const StreamIntent intent)
39094332d3Sopenharmony_ci{
40094332d3Sopenharmony_ci    sptr<OHOS::IBufferProducer> producer;
41094332d3Sopenharmony_ci    constexpr uint32_t DATA_SPACE = 8; // picture dataspace
42094332d3Sopenharmony_ci    constexpr uint32_t TUNNEL_MODE = 5; // tunnel mode
43094332d3Sopenharmony_ci    constexpr uint32_t BUFFER_QUEUE_SIZE = 8; // set bufferQueue size
44094332d3Sopenharmony_ci    if (intent == PREVIEW) {
45094332d3Sopenharmony_ci        streamInfo.width_ = PREVIEW_WIDTH;
46094332d3Sopenharmony_ci        streamInfo.height_ = PREVIEW_HEIGHT;
47094332d3Sopenharmony_ci        streamInfo.format_ = PIXEL_FMT_RGBA_8888;
48094332d3Sopenharmony_ci    }
49094332d3Sopenharmony_ci    streamInfo.streamId_ = streamId;
50094332d3Sopenharmony_ci    streamInfo.dataspace_ = DATA_SPACE;
51094332d3Sopenharmony_ci    streamInfo.intent_ = intent;
52094332d3Sopenharmony_ci    streamInfo.tunneledMode_ = TUNNEL_MODE;
53094332d3Sopenharmony_ci    producer = streamCustomer->CreateProducer();
54094332d3Sopenharmony_ci    streamInfo.bufferQueue_ = new BufferProducerSequenceable(producer);
55094332d3Sopenharmony_ci    ASSERT_NE(streamInfo.bufferQueue_, nullptr);
56094332d3Sopenharmony_ci    streamInfo.bufferQueue_->producer_->SetQueueSize(BUFFER_QUEUE_SIZE);
57094332d3Sopenharmony_ci}
58094332d3Sopenharmony_ci
59094332d3Sopenharmony_civoid DoublePreviewTest::CreateStream(int streamId, StreamIntent intent)
60094332d3Sopenharmony_ci{
61094332d3Sopenharmony_ci    StreamInfo streamInfo = {};
62094332d3Sopenharmony_ci
63094332d3Sopenharmony_ci    if (intent == PREVIEW) {
64094332d3Sopenharmony_ci        if (streamId == cameraBase_->STREAM_ID_PREVIEW) {
65094332d3Sopenharmony_ci            if (streamCustomerPreview_ == nullptr) {
66094332d3Sopenharmony_ci                    streamCustomerPreview_ = std::make_shared<StreamCustomer>();
67094332d3Sopenharmony_ci                    SetStreamInfo(streamInfo, streamCustomerPreview_, streamId, intent);
68094332d3Sopenharmony_ci                    std::vector<StreamInfo>().swap(streamInfos_);
69094332d3Sopenharmony_ci                    streamInfos_.push_back(streamInfo);
70094332d3Sopenharmony_ci                }
71094332d3Sopenharmony_ci        } else if (streamId == STREAMID_PREVIEW_DOUBLE) {
72094332d3Sopenharmony_ci            if (streamCustomerPreviewDouble_ == nullptr) {
73094332d3Sopenharmony_ci                streamCustomerPreviewDouble_ = std::make_shared<StreamCustomer>();
74094332d3Sopenharmony_ci                SetStreamInfo(streamInfo, streamCustomerPreviewDouble_, streamId, intent);
75094332d3Sopenharmony_ci                std::vector<StreamInfo>().swap(streamInfos_);
76094332d3Sopenharmony_ci                streamInfos_.push_back(streamInfo);
77094332d3Sopenharmony_ci            }
78094332d3Sopenharmony_ci        }
79094332d3Sopenharmony_ci    }
80094332d3Sopenharmony_ci    result_ = (CamRetCode)cameraBase_->streamOperator->CreateStreams(streamInfos_);
81094332d3Sopenharmony_ci    EXPECT_EQ(result_, HDI::Camera::V1_0::NO_ERROR);
82094332d3Sopenharmony_ci    if (result_ == HDI::Camera::V1_0::NO_ERROR) {
83094332d3Sopenharmony_ci        CAMERA_LOGI("CreateStreams success.");
84094332d3Sopenharmony_ci    } else {
85094332d3Sopenharmony_ci        CAMERA_LOGE("CreateStreams fail, result_ = %{public}d", result_);
86094332d3Sopenharmony_ci    }
87094332d3Sopenharmony_ci}
88094332d3Sopenharmony_ci
89094332d3Sopenharmony_civoid DoublePreviewTest::CommitStream()
90094332d3Sopenharmony_ci{
91094332d3Sopenharmony_ci    result_ = (CamRetCode)cameraBase_->streamOperator->CommitStreams(NORMAL, cameraBase_->ability_);
92094332d3Sopenharmony_ci    EXPECT_EQ(result_, HDI::Camera::V1_0::NO_ERROR);
93094332d3Sopenharmony_ci    if (result_ == HDI::Camera::V1_0::NO_ERROR) {
94094332d3Sopenharmony_ci        CAMERA_LOGI("CommitStreams preview success.");
95094332d3Sopenharmony_ci    } else {
96094332d3Sopenharmony_ci        CAMERA_LOGE("CommitStreams preview  fail, result_ = %{public}d", result_);
97094332d3Sopenharmony_ci    }
98094332d3Sopenharmony_ci}
99094332d3Sopenharmony_ci
100094332d3Sopenharmony_civoid DoublePreviewTest::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)
101094332d3Sopenharmony_ci{
102094332d3Sopenharmony_ci    captureInfo_.streamIds_ = {streamId};
103094332d3Sopenharmony_ci    captureInfo_.captureSetting_ = cameraBase_->ability_;
104094332d3Sopenharmony_ci    captureInfo_.enableShutterCallback_ = shutterCallback;
105094332d3Sopenharmony_ci    constexpr uint32_t TIME_FOR_WAIT_IMAGE_PREVIEW = 2; // sleep two second
106094332d3Sopenharmony_ci    result_ = (CamRetCode)cameraBase_->streamOperator->Capture(captureId, captureInfo_, isStreaming);
107094332d3Sopenharmony_ci    EXPECT_EQ(result_, HDI::Camera::V1_0::NO_ERROR);
108094332d3Sopenharmony_ci    if (result_ == HDI::Camera::V1_0::NO_ERROR) {
109094332d3Sopenharmony_ci        CAMERA_LOGI("check Capture: Capture success, captureId = %{public}d", captureId);
110094332d3Sopenharmony_ci    } else {
111094332d3Sopenharmony_ci        CAMERA_LOGE("check Capture: Capture fail, captureId = %{public}d, result_ = %{public}d", captureId, result_);
112094332d3Sopenharmony_ci    }
113094332d3Sopenharmony_ci    if (captureId == cameraBase_->CAPTURE_ID_PREVIEW) {
114094332d3Sopenharmony_ci        streamCustomerPreview_->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) {
115094332d3Sopenharmony_ci            CAMERA_LOGI("preview size = %{public}u", size);
116094332d3Sopenharmony_ci        });
117094332d3Sopenharmony_ci    } else if (captureId == CAPTUREID_PREVIEW_DOUBLE) {
118094332d3Sopenharmony_ci        streamCustomerPreviewDouble_->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) {
119094332d3Sopenharmony_ci            CAMERA_LOGI("preview double size = %{public}u", size);
120094332d3Sopenharmony_ci        });
121094332d3Sopenharmony_ci    } else {
122094332d3Sopenharmony_ci        CAMERA_LOGE("StartCapture ignore command");
123094332d3Sopenharmony_ci    }
124094332d3Sopenharmony_ci    sleep(TIME_FOR_WAIT_IMAGE_PREVIEW);
125094332d3Sopenharmony_ci}
126094332d3Sopenharmony_ci
127094332d3Sopenharmony_civoid DoublePreviewTest::StopStream(std::vector<int> &captureIds, std::vector<int> &streamIds)
128094332d3Sopenharmony_ci{
129094332d3Sopenharmony_ci    sleep(TIME_FOR_WAIT_CANCEL_CAPTURE);
130094332d3Sopenharmony_ci    if (captureIds.size() == 0) {
131094332d3Sopenharmony_ci        return;
132094332d3Sopenharmony_ci    }
133094332d3Sopenharmony_ci    for (const auto &captureId : captureIds) {
134094332d3Sopenharmony_ci        if (captureId == cameraBase_->CAPTURE_ID_PREVIEW) {
135094332d3Sopenharmony_ci            streamCustomerPreview_->ReceiveFrameOff();
136094332d3Sopenharmony_ci        } else if (captureId == CAPTUREID_PREVIEW_DOUBLE) {
137094332d3Sopenharmony_ci            streamCustomerPreviewDouble_->ReceiveFrameOff();
138094332d3Sopenharmony_ci        }  else if (captureId == cameraBase_->CAPTURE_ID_CAPTURE) {
139094332d3Sopenharmony_ci            cameraBase_->streamCustomerCapture_->ReceiveFrameOff();
140094332d3Sopenharmony_ci        } else if (captureId == cameraBase_->CAPTURE_ID_VIDEO) {
141094332d3Sopenharmony_ci            cameraBase_->streamCustomerVideo_->ReceiveFrameOff();
142094332d3Sopenharmony_ci            sleep(TIME_FOR_WAIT_CANCEL_CAPTURE);
143094332d3Sopenharmony_ci            cameraBase_->CloseFd();
144094332d3Sopenharmony_ci        } else {
145094332d3Sopenharmony_ci            CAMERA_LOGE("StopStream ignore command.");
146094332d3Sopenharmony_ci        }
147094332d3Sopenharmony_ci    }
148094332d3Sopenharmony_ci    for (auto &captureId : captureIds) {
149094332d3Sopenharmony_ci        result_ = (CamRetCode)cameraBase_->streamOperator->CancelCapture(captureId);
150094332d3Sopenharmony_ci        sleep(TIME_FOR_WAIT_CANCEL_CAPTURE);
151094332d3Sopenharmony_ci        EXPECT_EQ(result_, HDI::Camera::V1_0::NO_ERROR);
152094332d3Sopenharmony_ci        if (result_ == HDI::Camera::V1_0::NO_ERROR) {
153094332d3Sopenharmony_ci            CAMERA_LOGI("check Capture: CancelCapture success, captureId = %{public}d", captureId);
154094332d3Sopenharmony_ci        } else {
155094332d3Sopenharmony_ci            CAMERA_LOGE("check Capture: CancelCapture fail, captureId = %{public}d, result_ = %{public}d",
156094332d3Sopenharmony_ci                captureId, result_);
157094332d3Sopenharmony_ci        }
158094332d3Sopenharmony_ci    }
159094332d3Sopenharmony_ci}
160094332d3Sopenharmony_ci
161094332d3Sopenharmony_ci/**
162094332d3Sopenharmony_ci  * @tc.name: double preview
163094332d3Sopenharmony_ci  * @tc.desc: Commit 2 streams together, Double preview streams, isStreaming is true.
164094332d3Sopenharmony_ci  * @tc.level: Level1
165094332d3Sopenharmony_ci  * @tc.size: MediumTest
166094332d3Sopenharmony_ci  * @tc.type: Function
167094332d3Sopenharmony_ci  */
168094332d3Sopenharmony_cistatic HWTEST_F(DoublePreviewTest, double_preview_001, TestSize.Level1)
169094332d3Sopenharmony_ci{
170094332d3Sopenharmony_ci    // Get the stream manager
171094332d3Sopenharmony_ci    cameraBase_->AchieveStreamOperator();
172094332d3Sopenharmony_ci
173094332d3Sopenharmony_ci    // Start stream
174094332d3Sopenharmony_ci    CreateStream(cameraBase_->STREAM_ID_PREVIEW, PREVIEW);
175094332d3Sopenharmony_ci    CreateStream(STREAMID_PREVIEW_DOUBLE, PREVIEW);
176094332d3Sopenharmony_ci
177094332d3Sopenharmony_ci    // Commit stream
178094332d3Sopenharmony_ci    CommitStream();
179094332d3Sopenharmony_ci
180094332d3Sopenharmony_ci    // Get preview
181094332d3Sopenharmony_ci    StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
182094332d3Sopenharmony_ci    StartCapture(STREAMID_PREVIEW_DOUBLE, CAPTUREID_PREVIEW_DOUBLE, false, true);
183094332d3Sopenharmony_ci
184094332d3Sopenharmony_ci    constexpr uint32_t TIME_FOR_WAIT_IMAGE_PREVIEW = 10; // sleep ten second
185094332d3Sopenharmony_ci    sleep(TIME_FOR_WAIT_IMAGE_PREVIEW);
186094332d3Sopenharmony_ci
187094332d3Sopenharmony_ci    std::vector<int> captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, CAPTUREID_PREVIEW_DOUBLE};
188094332d3Sopenharmony_ci    std::vector<int> streamIds = {cameraBase_->STREAM_ID_PREVIEW, STREAMID_PREVIEW_DOUBLE};
189094332d3Sopenharmony_ci    StopStream(captureIds, streamIds);
190094332d3Sopenharmony_ci}
191094332d3Sopenharmony_ci
192094332d3Sopenharmony_ci/**
193094332d3Sopenharmony_ci  * @tc.name: double preview and still_capture
194094332d3Sopenharmony_ci  * @tc.desc: Commit 3 streams together, Double preview and still_capture streams, isStreaming is true.
195094332d3Sopenharmony_ci  * @tc.level: Level1
196094332d3Sopenharmony_ci  * @tc.size: MediumTest
197094332d3Sopenharmony_ci  * @tc.type: Function
198094332d3Sopenharmony_ci  */
199094332d3Sopenharmony_cistatic HWTEST_F(DoublePreviewTest, double_preview_002, TestSize.Level1)
200094332d3Sopenharmony_ci{
201094332d3Sopenharmony_ci    // Get the stream manager
202094332d3Sopenharmony_ci    cameraBase_->AchieveStreamOperator();
203094332d3Sopenharmony_ci
204094332d3Sopenharmony_ci    // Start stream
205094332d3Sopenharmony_ci    CreateStream(cameraBase_->STREAM_ID_PREVIEW, PREVIEW);
206094332d3Sopenharmony_ci    CreateStream(STREAMID_PREVIEW_DOUBLE, PREVIEW);
207094332d3Sopenharmony_ci    cameraBase_->intents = {STILL_CAPTURE};
208094332d3Sopenharmony_ci    cameraBase_->StartStream(cameraBase_->intents);
209094332d3Sopenharmony_ci
210094332d3Sopenharmony_ci    // Get preview
211094332d3Sopenharmony_ci    StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
212094332d3Sopenharmony_ci    StartCapture(STREAMID_PREVIEW_DOUBLE, CAPTUREID_PREVIEW_DOUBLE, false, true);
213094332d3Sopenharmony_ci    // add dumy exif info
214094332d3Sopenharmony_ci    constexpr double latitude = 27.987500; // dummy data: Qomolangma latitde
215094332d3Sopenharmony_ci    constexpr double longitude = 86.927500; // dummy data: Qomolangma longituude
216094332d3Sopenharmony_ci    constexpr double altitude = 8848.86; // dummy data: Qomolangma altitude
217094332d3Sopenharmony_ci    constexpr size_t entryCapacity = 100;
218094332d3Sopenharmony_ci    constexpr size_t dataCapacity = 2000;
219094332d3Sopenharmony_ci    std::shared_ptr<CameraSetting>  captureSetting =
220094332d3Sopenharmony_ci        std::make_shared<CameraSetting>(entryCapacity, dataCapacity);
221094332d3Sopenharmony_ci    std::vector<double> gps;
222094332d3Sopenharmony_ci    gps.push_back(latitude);
223094332d3Sopenharmony_ci    gps.push_back(longitude);
224094332d3Sopenharmony_ci    gps.push_back(altitude);
225094332d3Sopenharmony_ci    captureSetting->addEntry(OHOS_JPEG_GPS_COORDINATES, gps.data(), gps.size());
226094332d3Sopenharmony_ci    std::vector<uint8_t> setting;
227094332d3Sopenharmony_ci    MetadataUtils::ConvertMetadataToVec(captureSetting, setting);
228094332d3Sopenharmony_ci
229094332d3Sopenharmony_ci    CaptureInfo captureInfo = {};
230094332d3Sopenharmony_ci    captureInfo.streamIds_ = {cameraBase_->STREAM_ID_CAPTURE};
231094332d3Sopenharmony_ci    captureInfo.captureSetting_ = setting;
232094332d3Sopenharmony_ci    captureInfo.enableShutterCallback_ = false;
233094332d3Sopenharmony_ci    cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->Capture(cameraBase_->CAPTURE_ID_CAPTURE,
234094332d3Sopenharmony_ci        captureInfo, true);
235094332d3Sopenharmony_ci    EXPECT_EQ(cameraBase_->rc, HDI::Camera::V1_0::NO_ERROR);
236094332d3Sopenharmony_ci    if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
237094332d3Sopenharmony_ci        CAMERA_LOGI("check Capture: Capture success, captureId = %{public}d", cameraBase_->CAPTURE_ID_CAPTURE);
238094332d3Sopenharmony_ci    } else {
239094332d3Sopenharmony_ci        CAMERA_LOGE("check Capture: Capture fail, captureId = %{public}d, rc = %{public}d",
240094332d3Sopenharmony_ci            cameraBase_->CAPTURE_ID_CAPTURE, cameraBase_->rc);
241094332d3Sopenharmony_ci    }
242094332d3Sopenharmony_ci    cameraBase_->streamCustomerCapture_->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) {
243094332d3Sopenharmony_ci        cameraBase_->StoreImage(addr, size);
244094332d3Sopenharmony_ci    });
245094332d3Sopenharmony_ci
246094332d3Sopenharmony_ci    constexpr uint32_t TIME_FOR_WAIT_IMAGE_PREVIEW = 5; // sleep five second
247094332d3Sopenharmony_ci    sleep(TIME_FOR_WAIT_IMAGE_PREVIEW);
248094332d3Sopenharmony_ci
249094332d3Sopenharmony_ci    std::vector<int> captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, CAPTUREID_PREVIEW_DOUBLE,
250094332d3Sopenharmony_ci        cameraBase_->CAPTURE_ID_CAPTURE};
251094332d3Sopenharmony_ci    std::vector<int> streamIds = {cameraBase_->STREAM_ID_PREVIEW, STREAMID_PREVIEW_DOUBLE,
252094332d3Sopenharmony_ci        cameraBase_->STREAM_ID_CAPTURE};
253094332d3Sopenharmony_ci    StopStream(captureIds, streamIds);
254094332d3Sopenharmony_ci}
255094332d3Sopenharmony_ci
256094332d3Sopenharmony_ci/**
257094332d3Sopenharmony_ci  * @tc.name: double preview and video
258094332d3Sopenharmony_ci  * @tc.desc: Commit 3 streams together, Double preview and video streams, isStreaming is true.
259094332d3Sopenharmony_ci  * @tc.level: Level1
260094332d3Sopenharmony_ci  * @tc.size: MediumTest
261094332d3Sopenharmony_ci  * @tc.type: Function
262094332d3Sopenharmony_ci  */
263094332d3Sopenharmony_cistatic HWTEST_F(DoublePreviewTest, double_preview_003, TestSize.Level1)
264094332d3Sopenharmony_ci{
265094332d3Sopenharmony_ci    // Get the stream manager
266094332d3Sopenharmony_ci    cameraBase_->AchieveStreamOperator();
267094332d3Sopenharmony_ci
268094332d3Sopenharmony_ci    // Start stream
269094332d3Sopenharmony_ci    CreateStream(cameraBase_->STREAM_ID_PREVIEW, PREVIEW);
270094332d3Sopenharmony_ci    CreateStream(STREAMID_PREVIEW_DOUBLE, PREVIEW);
271094332d3Sopenharmony_ci    cameraBase_->intents = {VIDEO};
272094332d3Sopenharmony_ci    cameraBase_->StartStream(cameraBase_->intents);
273094332d3Sopenharmony_ci
274094332d3Sopenharmony_ci    // Get preview
275094332d3Sopenharmony_ci    StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
276094332d3Sopenharmony_ci    StartCapture(STREAMID_PREVIEW_DOUBLE, CAPTUREID_PREVIEW_DOUBLE, false, true);
277094332d3Sopenharmony_ci    cameraBase_->StartCapture(cameraBase_->STREAM_ID_VIDEO, cameraBase_->CAPTURE_ID_VIDEO, false, true);
278094332d3Sopenharmony_ci
279094332d3Sopenharmony_ci    constexpr uint32_t TIME_FOR_WAIT_IMAGE_PREVIEW = 5; // sleep five second
280094332d3Sopenharmony_ci    sleep(TIME_FOR_WAIT_IMAGE_PREVIEW);
281094332d3Sopenharmony_ci
282094332d3Sopenharmony_ci    std::vector<int> captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, CAPTUREID_PREVIEW_DOUBLE,
283094332d3Sopenharmony_ci        cameraBase_->CAPTURE_ID_VIDEO};
284094332d3Sopenharmony_ci    std::vector<int> streamIds = {cameraBase_->STREAM_ID_PREVIEW, STREAMID_PREVIEW_DOUBLE,
285094332d3Sopenharmony_ci        cameraBase_->STREAM_ID_VIDEO};
286094332d3Sopenharmony_ci    StopStream(captureIds, streamIds);
287094332d3Sopenharmony_ci}
288