1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except 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 "usb_camera_test_mult.h"
16094332d3Sopenharmony_ci
17094332d3Sopenharmony_civoid UtestUSBCameraTestMult::SetUpTestCase(void)
18094332d3Sopenharmony_ci{}
19094332d3Sopenharmony_civoid UtestUSBCameraTestMult::TearDownTestCase(void)
20094332d3Sopenharmony_ci{}
21094332d3Sopenharmony_civoid UtestUSBCameraTestMult::SetUp(void)
22094332d3Sopenharmony_ci{
23094332d3Sopenharmony_ci    if (cameraBase_ == nullptr)
24094332d3Sopenharmony_ci    cameraBase_ = std::make_shared<TestCameraBase>();
25094332d3Sopenharmony_ci    cameraBase_->UsbInit();
26094332d3Sopenharmony_ci}
27094332d3Sopenharmony_civoid UtestUSBCameraTestMult::TearDown(void)
28094332d3Sopenharmony_ci{
29094332d3Sopenharmony_ci    cameraBase_->Close();
30094332d3Sopenharmony_ci}
31094332d3Sopenharmony_ci
32094332d3Sopenharmony_ciCamRetCode UtestUSBCameraTestMult::SelectOpenCamera(std::string cameraId)
33094332d3Sopenharmony_ci{
34094332d3Sopenharmony_ci    cameraBase_->cameraHost->GetCameraAbility(cameraId, vecAbility_);
35094332d3Sopenharmony_ci    MetadataUtils::ConvertVecToMetadata(vecAbility_, ability_);
36094332d3Sopenharmony_ci    const OHOS::sptr<DemoCameraDeviceCallback> callback = new DemoCameraDeviceCallback();
37094332d3Sopenharmony_ci    cameraBase_->rc = (CamRetCode)cameraBase_->cameraHost->OpenCamera(cameraId, callback, cameraDevice_);
38094332d3Sopenharmony_ci    if (cameraBase_->rc != HDI::Camera::V1_0::NO_ERROR || cameraDevice_ == nullptr) {
39094332d3Sopenharmony_ci        std::cout << "OpenCamera2 failed, rc = " << cameraBase_->rc << std::endl;
40094332d3Sopenharmony_ci        return cameraBase_->rc;
41094332d3Sopenharmony_ci    }
42094332d3Sopenharmony_ci    std::cout << "OpenCamera2 success." << std::endl;
43094332d3Sopenharmony_ci    return cameraBase_->rc;
44094332d3Sopenharmony_ci}
45094332d3Sopenharmony_ci
46094332d3Sopenharmony_civoid UtestUSBCameraTestMult::AchieveStreamOperator()
47094332d3Sopenharmony_ci{
48094332d3Sopenharmony_ci    OHOS::sptr<DemoStreamOperatorCallback> streamOperatorCallback = new DemoStreamOperatorCallback();
49094332d3Sopenharmony_ci    cameraBase_->rc = (CamRetCode)cameraDevice_->GetStreamOperator(streamOperatorCallback, streamOperator_);
50094332d3Sopenharmony_ci    EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
51094332d3Sopenharmony_ci    if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
52094332d3Sopenharmony_ci        std::cout << "AchieveStreamOperator2 success." << std::endl;
53094332d3Sopenharmony_ci    } else {
54094332d3Sopenharmony_ci        std::cout << "AchieveStreamOperator2 fail, rc = " << cameraBase_->rc << std::endl;
55094332d3Sopenharmony_ci    }
56094332d3Sopenharmony_ci}
57094332d3Sopenharmony_ci
58094332d3Sopenharmony_civoid UtestUSBCameraTestMult::DefaultInfosPreview()
59094332d3Sopenharmony_ci{
60094332d3Sopenharmony_ci    if (streamCustomerPreview_ == nullptr) {
61094332d3Sopenharmony_ci        streamCustomerPreview_ = std::make_shared<StreamCustomer>();
62094332d3Sopenharmony_ci    }
63094332d3Sopenharmony_ci    streamInfoPre_.streamId_ = STREAM_ID_PREVIEW_DOUBLE;
64094332d3Sopenharmony_ci    streamInfoPre_.width_ = PREVIEW_WIDTH; // 640:picture width
65094332d3Sopenharmony_ci    streamInfoPre_.height_ = PREVIEW_HEIGHT; // 480:picture height
66094332d3Sopenharmony_ci    streamInfoPre_.format_ = PIXEL_FMT_RGBA_8888;
67094332d3Sopenharmony_ci    streamInfoPre_.dataspace_ = 8; // 8:picture dataspace
68094332d3Sopenharmony_ci    streamInfoPre_.intent_ = PREVIEW;
69094332d3Sopenharmony_ci    streamInfoPre_.tunneledMode_ = 5; // 5:tunnel mode
70094332d3Sopenharmony_ci    streamInfoPre_.bufferQueue_ = new BufferProducerSequenceable(streamCustomerPreview_->CreateProducer());
71094332d3Sopenharmony_ci    ASSERT_NE(streamInfoPre_.bufferQueue_, nullptr);
72094332d3Sopenharmony_ci    streamInfoPre_.bufferQueue_->producer_->SetQueueSize(8); // 8:set bufferQueue size
73094332d3Sopenharmony_ci    std::cout << "preview success1." << std::endl;
74094332d3Sopenharmony_ci    std::vector<StreamInfo>().swap(streamInfos_);
75094332d3Sopenharmony_ci    streamInfos_.push_back(streamInfoPre_);
76094332d3Sopenharmony_ci}
77094332d3Sopenharmony_ci
78094332d3Sopenharmony_civoid UtestUSBCameraTestMult::DefaultInfosVideo()
79094332d3Sopenharmony_ci{
80094332d3Sopenharmony_ci    if (streamCustomerVideo_ == nullptr) {
81094332d3Sopenharmony_ci        streamCustomerVideo_ = std::make_shared<StreamCustomer>();
82094332d3Sopenharmony_ci    }
83094332d3Sopenharmony_ci    streamInfoVideo_.streamId_ = STREAM_ID_VIDEO_DOUBLE;
84094332d3Sopenharmony_ci    streamInfoVideo_.width_ = VIDEO_WIDTH; // 1280:picture width
85094332d3Sopenharmony_ci    streamInfoVideo_.height_ = VIDEO_HEIGHT; // 960:picture height
86094332d3Sopenharmony_ci    streamInfoVideo_.format_ = videoFormat_;
87094332d3Sopenharmony_ci    streamInfoVideo_.dataspace_ = 8; // 8:picture dataspace
88094332d3Sopenharmony_ci    streamInfoVideo_.intent_ = VIDEO;
89094332d3Sopenharmony_ci    streamInfoVideo_.encodeType_ = ENCODE_TYPE_H264;
90094332d3Sopenharmony_ci    streamInfoVideo_.tunneledMode_ = 5; // 5:tunnel mode
91094332d3Sopenharmony_ci    streamInfoVideo_.bufferQueue_ = new BufferProducerSequenceable(streamCustomerVideo_->CreateProducer());
92094332d3Sopenharmony_ci    ASSERT_NE(streamInfoVideo_.bufferQueue_, nullptr);
93094332d3Sopenharmony_ci    streamInfoVideo_.bufferQueue_->producer_->SetQueueSize(8); // 8:set bufferQueue size
94094332d3Sopenharmony_ci    std::cout << "video success1." << std::endl;
95094332d3Sopenharmony_ci    std::vector<StreamInfo>().swap(streamInfos_);
96094332d3Sopenharmony_ci    streamInfos_.push_back(streamInfoVideo_);
97094332d3Sopenharmony_ci}
98094332d3Sopenharmony_ci
99094332d3Sopenharmony_civoid UtestUSBCameraTestMult::DefaultInfosCapture()
100094332d3Sopenharmony_ci{
101094332d3Sopenharmony_ci    if (streamCustomerCapture_ == nullptr) {
102094332d3Sopenharmony_ci        streamCustomerCapture_ = std::make_shared<StreamCustomer>();
103094332d3Sopenharmony_ci    }
104094332d3Sopenharmony_ci    streamInfoCapture_.streamId_ = STREAM_ID_CAPTURE_DOUBLE;
105094332d3Sopenharmony_ci    streamInfoCapture_.width_ = CAPTURE_WIDTH; // 1280:picture width
106094332d3Sopenharmony_ci    streamInfoCapture_.height_ = CAPTURE_HEIGHT; // 960:picture height
107094332d3Sopenharmony_ci    streamInfoCapture_.format_ = PIXEL_FMT_RGBA_8888;
108094332d3Sopenharmony_ci    streamInfoCapture_.dataspace_ = 8; // 8:picture dataspace
109094332d3Sopenharmony_ci    streamInfoCapture_.intent_ = STILL_CAPTURE;
110094332d3Sopenharmony_ci    streamInfoCapture_.encodeType_ = ENCODE_TYPE_JPEG;
111094332d3Sopenharmony_ci    streamInfoCapture_.tunneledMode_ = 5; // 5:tunnel mode
112094332d3Sopenharmony_ci    streamInfoCapture_.bufferQueue_ = new BufferProducerSequenceable(streamCustomerCapture_->CreateProducer());
113094332d3Sopenharmony_ci    ASSERT_NE(streamInfoCapture_.bufferQueue_, nullptr);
114094332d3Sopenharmony_ci    streamInfoCapture_.bufferQueue_->producer_->SetQueueSize(8); // 8:set bufferQueue size
115094332d3Sopenharmony_ci    std::cout << "capture success1." << std::endl;
116094332d3Sopenharmony_ci    std::vector<StreamInfo>().swap(streamInfos_);
117094332d3Sopenharmony_ci    streamInfos_.push_back(streamInfoCapture_);
118094332d3Sopenharmony_ci}
119094332d3Sopenharmony_ci
120094332d3Sopenharmony_civoid UtestUSBCameraTestMult::StartStream(std::vector<StreamIntent> intents)
121094332d3Sopenharmony_ci{
122094332d3Sopenharmony_ci    for (auto& intent : intents) {
123094332d3Sopenharmony_ci        if (intent == PREVIEW) {
124094332d3Sopenharmony_ci            DefaultInfosPreview();
125094332d3Sopenharmony_ci        } else if (intent == VIDEO) {
126094332d3Sopenharmony_ci            DefaultInfosVideo();
127094332d3Sopenharmony_ci        } else if (intent == STILL_CAPTURE) {
128094332d3Sopenharmony_ci            DefaultInfosCapture();
129094332d3Sopenharmony_ci        }
130094332d3Sopenharmony_ci        cameraBase_->rc = (CamRetCode)streamOperator_->CreateStreams(streamInfos_);
131094332d3Sopenharmony_ci        EXPECT_EQ(false, cameraBase_->rc != HDI::Camera::V1_0::NO_ERROR);
132094332d3Sopenharmony_ci        if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
133094332d3Sopenharmony_ci            std::cout << "CreateStreams2 success." << std::endl;
134094332d3Sopenharmony_ci        } else {
135094332d3Sopenharmony_ci            std::cout << "CreateStreams2 fail, rc = " << cameraBase_->rc << std::endl;
136094332d3Sopenharmony_ci        }
137094332d3Sopenharmony_ci
138094332d3Sopenharmony_ci        cameraBase_->rc = (CamRetCode)streamOperator_->CommitStreams(NORMAL, vecAbility_);
139094332d3Sopenharmony_ci        EXPECT_EQ(false, cameraBase_->rc != HDI::Camera::V1_0::NO_ERROR);
140094332d3Sopenharmony_ci        if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
141094332d3Sopenharmony_ci            std::cout << "CommitStreams2 success." << std::endl;
142094332d3Sopenharmony_ci        } else {
143094332d3Sopenharmony_ci            std::cout << "CommitStreams2 fail, rc = " << cameraBase_->rc << std::endl;
144094332d3Sopenharmony_ci        }
145094332d3Sopenharmony_ci    }
146094332d3Sopenharmony_ci}
147094332d3Sopenharmony_ci
148094332d3Sopenharmony_civoid UtestUSBCameraTestMult::StoreImage(const unsigned char *bufStart, const uint32_t size)
149094332d3Sopenharmony_ci{
150094332d3Sopenharmony_ci    constexpr uint32_t pathLen = 64;
151094332d3Sopenharmony_ci    char path[pathLen] = {0};
152094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE
153094332d3Sopenharmony_ci    char prefix[] = "/userdata/photo/";
154094332d3Sopenharmony_ci#else
155094332d3Sopenharmony_ci    char prefix[] = "/data/";
156094332d3Sopenharmony_ci#endif
157094332d3Sopenharmony_ci
158094332d3Sopenharmony_ci    int imgFD = 0;
159094332d3Sopenharmony_ci    int ret = 0;
160094332d3Sopenharmony_ci
161094332d3Sopenharmony_ci    struct timeval start = {};
162094332d3Sopenharmony_ci    gettimeofday(&start, nullptr);
163094332d3Sopenharmony_ci    if (sprintf_s(path, sizeof(path), "%spicture222_%ld.jpeg", prefix, start.tv_usec) < 0) {
164094332d3Sopenharmony_ci        CAMERA_LOGE("sprintf_s error .....\n");
165094332d3Sopenharmony_ci        return;
166094332d3Sopenharmony_ci    }
167094332d3Sopenharmony_ci
168094332d3Sopenharmony_ci    imgFD = open(path, O_RDWR | O_CREAT, 00766); // 00766:file operate permission
169094332d3Sopenharmony_ci    if (imgFD == -1) {
170094332d3Sopenharmony_ci        CAMERA_LOGE("demo test:open image file error %{public}s.....\n", strerror(errno));
171094332d3Sopenharmony_ci        return;
172094332d3Sopenharmony_ci    }
173094332d3Sopenharmony_ci
174094332d3Sopenharmony_ci    CAMERA_LOGD("demo test:StoreImage2 %{public}s size == %{public}d\n", path, size);
175094332d3Sopenharmony_ci
176094332d3Sopenharmony_ci    ret = write(imgFD, bufStart, size);
177094332d3Sopenharmony_ci    if (ret == -1) {
178094332d3Sopenharmony_ci        CAMERA_LOGE("demo test:write image file error %{public}s.....\n", strerror(errno));
179094332d3Sopenharmony_ci    }
180094332d3Sopenharmony_ci
181094332d3Sopenharmony_ci    close(imgFD);
182094332d3Sopenharmony_ci}
183094332d3Sopenharmony_ci
184094332d3Sopenharmony_civoid UtestUSBCameraTestMult::StoreVideo(const unsigned char *bufStart, const uint32_t size)
185094332d3Sopenharmony_ci{
186094332d3Sopenharmony_ci    int ret = 0;
187094332d3Sopenharmony_ci
188094332d3Sopenharmony_ci    ret = write(videoFd_, bufStart, size);
189094332d3Sopenharmony_ci    if (ret == -1) {
190094332d3Sopenharmony_ci        CAMERA_LOGE("demo test:write video file error %{public}s.....\n", strerror(errno));
191094332d3Sopenharmony_ci    }
192094332d3Sopenharmony_ci    CAMERA_LOGD("demo test:StoreVideo size == %{public}d\n", size);
193094332d3Sopenharmony_ci}
194094332d3Sopenharmony_ci
195094332d3Sopenharmony_civoid UtestUSBCameraTestMult::OpenVideoFile()
196094332d3Sopenharmony_ci{
197094332d3Sopenharmony_ci    constexpr uint32_t pathLen = 64;
198094332d3Sopenharmony_ci    char path[pathLen] = {0};
199094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE
200094332d3Sopenharmony_ci    char prefix[] = "/userdata/video/";
201094332d3Sopenharmony_ci#else
202094332d3Sopenharmony_ci    char prefix[] = "/data/";
203094332d3Sopenharmony_ci#endif
204094332d3Sopenharmony_ci    auto seconds = time(nullptr);
205094332d3Sopenharmony_ci    if (sprintf_s(path, sizeof(path), "%svideo222%ld.h264", prefix, seconds) < 0) {
206094332d3Sopenharmony_ci        CAMERA_LOGE("%{public}s: sprintf  failed", __func__);
207094332d3Sopenharmony_ci        return;
208094332d3Sopenharmony_ci    }
209094332d3Sopenharmony_ci    videoFd_ = open(path, O_RDWR | O_CREAT, 00766); // 00766:file operate permission
210094332d3Sopenharmony_ci    if (videoFd_ < 0) {
211094332d3Sopenharmony_ci        CAMERA_LOGE("demo test: StartVideo open %s %{public}s failed", path, strerror(errno));
212094332d3Sopenharmony_ci    }
213094332d3Sopenharmony_ci}
214094332d3Sopenharmony_ci
215094332d3Sopenharmony_civoid UtestUSBCameraTestMult::CloseFd()
216094332d3Sopenharmony_ci{
217094332d3Sopenharmony_ci    close(videoFd_);
218094332d3Sopenharmony_ci    videoFd_ = -1;
219094332d3Sopenharmony_ci}
220094332d3Sopenharmony_ci
221094332d3Sopenharmony_civoid UtestUSBCameraTestMult::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)
222094332d3Sopenharmony_ci{
223094332d3Sopenharmony_ci    // Get preview
224094332d3Sopenharmony_ci    captureInfo_.streamIds_ = {streamId};
225094332d3Sopenharmony_ci    captureInfo_.captureSetting_ = vecAbility_;
226094332d3Sopenharmony_ci    captureInfo_.enableShutterCallback_ = shutterCallback;
227094332d3Sopenharmony_ci    cameraBase_->rc = (CamRetCode)streamOperator_->Capture(captureId, captureInfo_, isStreaming);
228094332d3Sopenharmony_ci    EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
229094332d3Sopenharmony_ci    if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
230094332d3Sopenharmony_ci        std::cout << "check Capture: Capture2 success, captureId = " << captureId << std::endl;
231094332d3Sopenharmony_ci    } else {
232094332d3Sopenharmony_ci        std::cout << "check Capture: Capture2 fail, rc = " << cameraBase_->rc
233094332d3Sopenharmony_ci                  << ", captureId = " << captureId<< std::endl;
234094332d3Sopenharmony_ci    }
235094332d3Sopenharmony_ci    if (captureId == CAPTURE_ID_PREVIEW_DOUBLE) {
236094332d3Sopenharmony_ci        streamCustomerPreview_->ReceiveFrameOn(nullptr);
237094332d3Sopenharmony_ci    } else if (captureId == CAPTURE_ID_CAPTURE_DOUBLE) {
238094332d3Sopenharmony_ci        streamCustomerCapture_->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) {
239094332d3Sopenharmony_ci            StoreImage(addr, size);
240094332d3Sopenharmony_ci        });
241094332d3Sopenharmony_ci    } else if (captureId == CAPTURE_ID_VIDEO_DOUBLE) {
242094332d3Sopenharmony_ci        OpenVideoFile();
243094332d3Sopenharmony_ci        streamCustomerVideo_->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) {
244094332d3Sopenharmony_ci            StoreVideo(addr, size);
245094332d3Sopenharmony_ci        });
246094332d3Sopenharmony_ci    }
247094332d3Sopenharmony_ci    sleep(2); // 2:sleep two second
248094332d3Sopenharmony_ci}
249094332d3Sopenharmony_ci
250094332d3Sopenharmony_civoid UtestUSBCameraTestMult::StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds)
251094332d3Sopenharmony_ci{
252094332d3Sopenharmony_ci    constexpr uint32_t TIME_FOR_WAIT_CANCEL_CAPTURE = 2;
253094332d3Sopenharmony_ci    sleep(TIME_FOR_WAIT_CANCEL_CAPTURE);
254094332d3Sopenharmony_ci    if (captureIds.size() > 0) {
255094332d3Sopenharmony_ci        for (auto &captureId : captureIds) {
256094332d3Sopenharmony_ci            if (captureId == CAPTURE_ID_PREVIEW_DOUBLE) {
257094332d3Sopenharmony_ci                streamCustomerPreview_->ReceiveFrameOff();
258094332d3Sopenharmony_ci            } else if (captureId == CAPTURE_ID_CAPTURE_DOUBLE) {
259094332d3Sopenharmony_ci                streamCustomerCapture_->ReceiveFrameOff();
260094332d3Sopenharmony_ci            } else if (captureId == CAPTURE_ID_VIDEO_DOUBLE) {
261094332d3Sopenharmony_ci                streamCustomerVideo_->ReceiveFrameOff();
262094332d3Sopenharmony_ci                sleep(1);
263094332d3Sopenharmony_ci                CloseFd();
264094332d3Sopenharmony_ci            }
265094332d3Sopenharmony_ci        }
266094332d3Sopenharmony_ci        for (const auto &captureId : captureIds) {
267094332d3Sopenharmony_ci            std::cout << "check Capture: CancelCapture success, captureId = " << captureId << std::endl;
268094332d3Sopenharmony_ci            cameraBase_->rc = (CamRetCode)streamOperator_->CancelCapture(captureId);
269094332d3Sopenharmony_ci            sleep(TIME_FOR_WAIT_CANCEL_CAPTURE);
270094332d3Sopenharmony_ci            EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
271094332d3Sopenharmony_ci            if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
272094332d3Sopenharmony_ci                std::cout << "check Capture: CancelCapture success, captureId = " << captureId << std::endl;
273094332d3Sopenharmony_ci            } else {
274094332d3Sopenharmony_ci                std::cout << "check Capture: CancelCapture fail, rc = "
275094332d3Sopenharmony_ci                          << cameraBase_->rc <<", captureId = " << captureId << std::endl;
276094332d3Sopenharmony_ci            }
277094332d3Sopenharmony_ci        }
278094332d3Sopenharmony_ci    }
279094332d3Sopenharmony_ci    sleep(1); // 1:sleep two second
280094332d3Sopenharmony_ci    if (streamIds.size() > 0) {
281094332d3Sopenharmony_ci        // release stream
282094332d3Sopenharmony_ci        cameraBase_->rc = (CamRetCode)streamOperator_->ReleaseStreams(streamIds);
283094332d3Sopenharmony_ci        EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
284094332d3Sopenharmony_ci        if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
285094332d3Sopenharmony_ci            std::cout << "check Capture: ReleaseStreams success." << std::endl;
286094332d3Sopenharmony_ci        } else {
287094332d3Sopenharmony_ci            std::cout << "check Capture: ReleaseStreams fail, rc = "
288094332d3Sopenharmony_ci                      << cameraBase_->rc << ", streamIds = " << streamIds.front() << std::endl;
289094332d3Sopenharmony_ci        }
290094332d3Sopenharmony_ci    }
291094332d3Sopenharmony_ci}
292094332d3Sopenharmony_ci
293094332d3Sopenharmony_ciconst std::map<uint32_t, uint32_t> g_mapOhosFmtToPixFmt = {
294094332d3Sopenharmony_ci    { OHOS_CAMERA_FORMAT_RGBA_8888, PIXEL_FMT_RGBA_8888 },
295094332d3Sopenharmony_ci    { OHOS_CAMERA_FORMAT_YCRCB_420_SP, PIXEL_FMT_YCRCB_420_SP },
296094332d3Sopenharmony_ci};
297094332d3Sopenharmony_ci
298094332d3Sopenharmony_ciuint32_t UtestUSBCameraTestMult::ConvertPixfmtHal2V4l2(uint32_t ohosfmt)
299094332d3Sopenharmony_ci{
300094332d3Sopenharmony_ci    auto it = g_mapOhosFmtToPixFmt.find(ohosfmt);
301094332d3Sopenharmony_ci    if (it == g_mapOhosFmtToPixFmt.end()) {
302094332d3Sopenharmony_ci        CAMERA_LOGI("The ohosfmt is not find in g_mapOhosFmtToPixFmt");
303094332d3Sopenharmony_ci        return PIXEL_FMT_RGBA_8888; // default value
304094332d3Sopenharmony_ci    }
305094332d3Sopenharmony_ci    return it->second;
306094332d3Sopenharmony_ci}
307094332d3Sopenharmony_ci
308094332d3Sopenharmony_ci/**
309094332d3Sopenharmony_ci  * @tc.name: USB Camera
310094332d3Sopenharmony_ci  * @tc.desc: USB Camera, getCameraID success.
311094332d3Sopenharmony_ci  * @tc.level: Level0
312094332d3Sopenharmony_ci  * @tc.size: MediumTest
313094332d3Sopenharmony_ci  * @tc.type: Function
314094332d3Sopenharmony_ci  */
315094332d3Sopenharmony_ciTEST_F(UtestUSBCameraTestMult, camera_usb_mult_0001)
316094332d3Sopenharmony_ci{
317094332d3Sopenharmony_ci    std::vector<std::string> usbCameraIds;
318094332d3Sopenharmony_ci    cameraBase_->cameraHost->GetCameraIds(usbCameraIds);
319094332d3Sopenharmony_ci    // 1:number of connected cameras
320094332d3Sopenharmony_ci    usbCameraExit_ = usbCameraIds.size() > 1;
321094332d3Sopenharmony_ci    if (!usbCameraExit_) {
322094332d3Sopenharmony_ci        GTEST_SKIP() << "No usb camera plugged in" << std::endl;
323094332d3Sopenharmony_ci    }
324094332d3Sopenharmony_ci    cameraBase_->rc = cameraBase_->SelectOpenCamera(usbCameraIds[0]); // 0:first camera id
325094332d3Sopenharmony_ci    ASSERT_EQ(cameraBase_->rc, HDI::Camera::V1_0::NO_ERROR);
326094332d3Sopenharmony_ci    cameraBase_->rc = SelectOpenCamera(usbCameraIds[1]);  // 1:second camera id
327094332d3Sopenharmony_ci    ASSERT_EQ(cameraBase_->rc, HDI::Camera::V1_0::NO_ERROR);
328094332d3Sopenharmony_ci    cameraBase_->AchieveStreamOperator();
329094332d3Sopenharmony_ci    AchieveStreamOperator();
330094332d3Sopenharmony_ci
331094332d3Sopenharmony_ci    cameraBase_->intents = {PREVIEW};
332094332d3Sopenharmony_ci    cameraBase_->StartStream(cameraBase_->intents);
333094332d3Sopenharmony_ci    StartStream(cameraBase_->intents);
334094332d3Sopenharmony_ci    cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
335094332d3Sopenharmony_ci    StartCapture(STREAM_ID_PREVIEW_DOUBLE, CAPTURE_ID_PREVIEW_DOUBLE, false, true);
336094332d3Sopenharmony_ci    cameraBase_->captureIds = {cameraBase_->CAPTURE_ID_PREVIEW};
337094332d3Sopenharmony_ci    cameraBase_->streamIds = {cameraBase_->STREAM_ID_PREVIEW};
338094332d3Sopenharmony_ci    cameraBase_->StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
339094332d3Sopenharmony_ci    cameraBase_->captureIds = {CAPTURE_ID_PREVIEW_DOUBLE};
340094332d3Sopenharmony_ci    cameraBase_->streamIds = {STREAM_ID_PREVIEW_DOUBLE};
341094332d3Sopenharmony_ci    StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
342094332d3Sopenharmony_ci}
343094332d3Sopenharmony_ci
344094332d3Sopenharmony_ci/**
345094332d3Sopenharmony_ci  * @tc.name: USB Camera
346094332d3Sopenharmony_ci  * @tc.desc: USB Camera, getCameraID success.
347094332d3Sopenharmony_ci  * @tc.level: Level0
348094332d3Sopenharmony_ci  * @tc.size: MediumTest
349094332d3Sopenharmony_ci  * @tc.type: Function
350094332d3Sopenharmony_ci  */
351094332d3Sopenharmony_ciTEST_F(UtestUSBCameraTestMult, camera_usb_mult_0002)
352094332d3Sopenharmony_ci{
353094332d3Sopenharmony_ci    std::vector<std::string> usbCameraIds;
354094332d3Sopenharmony_ci    cameraBase_->cameraHost->GetCameraIds(usbCameraIds);
355094332d3Sopenharmony_ci    // 1:number of connected cameras
356094332d3Sopenharmony_ci    usbCameraExit_ = usbCameraIds.size() > 1;
357094332d3Sopenharmony_ci    if (!usbCameraExit_) {
358094332d3Sopenharmony_ci        GTEST_SKIP() << "No usb camera plugged in" << std::endl;
359094332d3Sopenharmony_ci    }
360094332d3Sopenharmony_ci    cameraBase_->rc = cameraBase_->SelectOpenCamera(usbCameraIds[0]); // 0:first camera id
361094332d3Sopenharmony_ci    ASSERT_EQ(cameraBase_->rc, HDI::Camera::V1_0::NO_ERROR);
362094332d3Sopenharmony_ci    cameraBase_->rc = SelectOpenCamera(usbCameraIds[1]);  // 1:second camera id
363094332d3Sopenharmony_ci    ASSERT_EQ(cameraBase_->rc, HDI::Camera::V1_0::NO_ERROR);
364094332d3Sopenharmony_ci    cameraBase_->AchieveStreamOperator();
365094332d3Sopenharmony_ci    AchieveStreamOperator();
366094332d3Sopenharmony_ci
367094332d3Sopenharmony_ci    cameraBase_->intents = {PREVIEW, STILL_CAPTURE};
368094332d3Sopenharmony_ci    cameraBase_->StartStream(cameraBase_->intents);
369094332d3Sopenharmony_ci    StartStream(cameraBase_->intents);
370094332d3Sopenharmony_ci    cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
371094332d3Sopenharmony_ci    cameraBase_->StartCapture(cameraBase_->STREAM_ID_CAPTURE, cameraBase_->CAPTURE_ID_CAPTURE, false, true);
372094332d3Sopenharmony_ci    StartCapture(STREAM_ID_PREVIEW_DOUBLE, CAPTURE_ID_PREVIEW_DOUBLE, false, true);
373094332d3Sopenharmony_ci    StartCapture(STREAM_ID_CAPTURE_DOUBLE, CAPTURE_ID_CAPTURE_DOUBLE, false, true);
374094332d3Sopenharmony_ci    cameraBase_->captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, cameraBase_->CAPTURE_ID_CAPTURE};
375094332d3Sopenharmony_ci    cameraBase_->streamIds = {cameraBase_->STREAM_ID_PREVIEW, cameraBase_->STREAM_ID_CAPTURE};
376094332d3Sopenharmony_ci    cameraBase_->StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
377094332d3Sopenharmony_ci    cameraBase_->captureIds = {CAPTURE_ID_PREVIEW_DOUBLE, CAPTURE_ID_CAPTURE_DOUBLE};
378094332d3Sopenharmony_ci    cameraBase_->streamIds = {STREAM_ID_PREVIEW_DOUBLE, STREAM_ID_CAPTURE_DOUBLE};
379094332d3Sopenharmony_ci    StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
380094332d3Sopenharmony_ci}
381094332d3Sopenharmony_ci
382094332d3Sopenharmony_ci/**
383094332d3Sopenharmony_ci  * @tc.name: USB Camera
384094332d3Sopenharmony_ci  * @tc.desc: USB Camera, getCameraID success.
385094332d3Sopenharmony_ci  * @tc.level: Level0
386094332d3Sopenharmony_ci  * @tc.size: MediumTest
387094332d3Sopenharmony_ci  * @tc.type: Function
388094332d3Sopenharmony_ci  */
389094332d3Sopenharmony_ciTEST_F(UtestUSBCameraTestMult, camera_usb_mult_0003)
390094332d3Sopenharmony_ci{
391094332d3Sopenharmony_ci    std::vector<std::string> usbCameraIds;
392094332d3Sopenharmony_ci    cameraBase_->cameraHost->GetCameraIds(usbCameraIds);
393094332d3Sopenharmony_ci    // 1:number of connected cameras
394094332d3Sopenharmony_ci    usbCameraExit_ = usbCameraIds.size() > 1;
395094332d3Sopenharmony_ci    if (!usbCameraExit_) {
396094332d3Sopenharmony_ci        GTEST_SKIP() << "No usb camera plugged in" << std::endl;
397094332d3Sopenharmony_ci    }
398094332d3Sopenharmony_ci    cameraBase_->rc = cameraBase_->SelectOpenCamera(usbCameraIds[0]); // 0:first camera id
399094332d3Sopenharmony_ci    ASSERT_EQ(cameraBase_->rc, HDI::Camera::V1_0::NO_ERROR);
400094332d3Sopenharmony_ci    cameraBase_->rc = SelectOpenCamera(usbCameraIds[1]);  // 1:second camera id
401094332d3Sopenharmony_ci    ASSERT_EQ(cameraBase_->rc, HDI::Camera::V1_0::NO_ERROR);
402094332d3Sopenharmony_ci    cameraBase_->AchieveStreamOperator();
403094332d3Sopenharmony_ci    AchieveStreamOperator();
404094332d3Sopenharmony_ci
405094332d3Sopenharmony_ci    ability_ = cameraBase_->GetCameraAbility();
406094332d3Sopenharmony_ci    EXPECT_NE(ability_, nullptr);
407094332d3Sopenharmony_ci    common_metadata_header_t *data = ability_->get();
408094332d3Sopenharmony_ci    EXPECT_NE(data, nullptr);
409094332d3Sopenharmony_ci    camera_metadata_item_t entry;
410094332d3Sopenharmony_ci    int ret = FindCameraMetadataItem(data, OHOS_ABILITY_STREAM_AVAILABLE_EXTEND_CONFIGURATIONS, &entry);
411094332d3Sopenharmony_ci
412094332d3Sopenharmony_ci    uint32_t format = 0;
413094332d3Sopenharmony_ci    if (ret == 0 && entry.data.i32 != nullptr && entry.count > 0) {
414094332d3Sopenharmony_ci        format = entry.data.i32[entry.count - 6]; // 6:The sixth digit from the bottom is the format of video
415094332d3Sopenharmony_ci    }
416094332d3Sopenharmony_ci    videoFormat_ = ConvertPixfmtHal2V4l2(format);
417094332d3Sopenharmony_ci
418094332d3Sopenharmony_ci    for (int i = 0; i < usbCameraIds.size(); i++) {
419094332d3Sopenharmony_ci        cameraBase_->rc = cameraBase_->SelectOpenCamera(usbCameraIds[i]);
420094332d3Sopenharmony_ci        ASSERT_EQ(cameraBase_->rc, HDI::Camera::V1_0::NO_ERROR);
421094332d3Sopenharmony_ci        // Get the stream manager
422094332d3Sopenharmony_ci        cameraBase_->AchieveStreamOperator();
423094332d3Sopenharmony_ci        // start stream
424094332d3Sopenharmony_ci        cameraBase_->intents = {PREVIEW, STILL_CAPTURE, VIDEO};
425094332d3Sopenharmony_ci        cameraBase_->StartStream(cameraBase_->intents);
426094332d3Sopenharmony_ci        // Get preview
427094332d3Sopenharmony_ci        cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
428094332d3Sopenharmony_ci        cameraBase_->StartCapture(cameraBase_->STREAM_ID_CAPTURE, cameraBase_->CAPTURE_ID_CAPTURE, false, true);
429094332d3Sopenharmony_ci        cameraBase_->StartCapture(cameraBase_->STREAM_ID_VIDEO, cameraBase_->CAPTURE_ID_VIDEO, false, true);
430094332d3Sopenharmony_ci        // release stream
431094332d3Sopenharmony_ci        cameraBase_->captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, cameraBase_->CAPTURE_ID_CAPTURE,
432094332d3Sopenharmony_ci        cameraBase_->CAPTURE_ID_VIDEO};
433094332d3Sopenharmony_ci        cameraBase_->streamIds = {cameraBase_->STREAM_ID_PREVIEW, cameraBase_->STREAM_ID_CAPTURE,
434094332d3Sopenharmony_ci        cameraBase_->STREAM_ID_VIDEO};
435094332d3Sopenharmony_ci        cameraBase_->StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
436094332d3Sopenharmony_ci    }
437094332d3Sopenharmony_ci}
438