1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file expected 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 #include "capture_test.h"
16 
17 using namespace OHOS;
18 using namespace std;
19 using namespace testing::ext;
20 using namespace OHOS::Camera;
21 
SetUpTestCase(void)22 void CaptureTest::SetUpTestCase(void) {}
TearDownTestCase(void)23 void CaptureTest::TearDownTestCase(void) {}
SetUp(void)24 void CaptureTest::SetUp(void)
25 {
26     Test_ = std::make_shared<OHOS::Camera::Test>();
27     Test_->Init();
28     Test_->Open();
29 }
TearDown(void)30 void CaptureTest::TearDown(void)
31 {
32     Test_->Close();
33 }
34 
35 /**
36   * @tc.name: preview and capture
37   * @tc.desc: Preview and still_capture streams, Commit 2 streams together, capture in order, isStreaming is true.
38   * @tc.size: MediumTest
39   * @tc.type: Function
40   */
41 HWTEST_F(CaptureTest, Camera_Capture_0001, TestSize.Level0)
42 {
43     std::cout << "==========[test log]check Capture: Preview and still_capture streams.";
44     std::cout << " Commit 2 streams together, capture in order, isStreaming is true." << std::endl;
45     // Configure two streams of information
46     Test_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
47     Test_->StartStream(Test_->intents);
48     // Capture preview stream
49     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
50     // Capture the photo stream, continuous capture
51     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, true);
52     // post-processing
53     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_capture};
54     Test_->streamIds.push_back(Test_->streamId_preview);
55     Test_->streamIds.push_back(Test_->streamId_capture);
56     Test_->StopStream(Test_->captureIds, Test_->streamIds);
57 }
58 
59 /**
60   * @tc.name: preview and capture
61   * @tc.desc: Preview + capture, then cloase camera, and preview + capture again.
62   * @tc.size: MediumTest
63   * @tc.type: Function
64   */
65 HWTEST_F(CaptureTest, Camera_Capture_0002, TestSize.Level2)
66 {
67     std::cout << "==========[test log]Preview + capture, cloase camera, and preview + capture." << std::endl;
68     // Configure two streams of information
69     Test_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
70     Test_->StartStream(Test_->intents);
71     // Capture preview stream
72     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
73     // Capture the photo stream, continuous capture
74     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, true);
75     // post-processing
76     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_capture};
77     Test_->streamIds = {Test_->streamId_preview, Test_->streamId_capture};
78     Test_->StopStream(Test_->captureIds, Test_->streamIds);
79     Test_->consumerMap_.clear();
80     // the 2nd time configures two streams of information
81     Test_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
82     Test_->StartStream(Test_->intents);
83     // Capture preview stream
84     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
85     // Capture the photo stream, continuous capture
86     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, true);
87     // post-processing
88     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_capture};
89     Test_->streamIds.push_back(Test_->streamId_preview);
90     Test_->streamIds.push_back(Test_->streamId_capture);
91     Test_->StopStream(Test_->captureIds, Test_->streamIds);
92 }
93 
94 /**
95   * @tc.name: preview and capture
96   * @tc.desc: Preview and still_capture streams + 3A, Commit 2 streams together, capture in order, isStreaming is true.
97   * @tc.size: MediumTest
98   * @tc.type: Function
99   */
100 HWTEST_F(CaptureTest, Camera_Capture_0003, TestSize.Level1)
101 {
102     std::cout << "==========[test log]check Capture: Preview and still_capture streams + 3A,";
103     std::cout  << "Commit 2 streams together, capture in order, isStreaming is true." << std::endl;
104     // Configure two streams of information
105     Test_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
106     Test_->StartStream(Test_->intents);
107     // Capture preview stream
108     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
109     // Issue 3A parameters to increase exposure
110     int32_t expo = 0xa0;
111     std::shared_ptr<Camera::CameraSetting> meta = std::make_shared<Camera::CameraSetting>(100, 2000);
112     meta->addEntry(OHOS_CONTROL_AE_EXPOSURE_COMPENSATION, &expo, 1);
113     Test_->rc = Test_->cameraDevice->UpdateSettings(meta);
114     if (Test_->rc == Camera::NO_ERROR) {
115         std::cout << "==========[test log]check Capture: UpdateSettings success, for 10s." << std::endl;
116     } else {
117         std::cout << "==========[test log]check Capture: UpdateSettings fail, rc = " << Test_->rc << std::endl;
118     }
119     sleep(3); // sleep for 3 seconds
120     // Capture the photo stream, continuous capture
121     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, true);
122     // post-processing
123     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_capture};
124     Test_->streamIds.push_back(Test_->streamId_preview);
125     Test_->streamIds.push_back(Test_->streamId_capture);
126     Test_->StopStream(Test_->captureIds, Test_->streamIds);
127 }
128 
129 /**
130   * @tc.name: preview and capture
131   * @tc.desc: Preview + capture, then switch to preview + video.
132   * @tc.size: MediumTest
133   * @tc.type: Function
134   */
135 HWTEST_F(CaptureTest, Camera_Capture_0004, TestSize.Level1)
136 {
137     std::cout << "==========[test log]check Capture: Preview + capture, then switch to preview + video." << std::endl;
138     std::cout << "==========[test log]check Capture: First, create preview + capture." << std::endl;
139     // Configure two streams of information
140     Test_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
141     Test_->StartStream(Test_->intents);
142     // Capture preview stream
143     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
144     // Capture the photo stream, continuous capture
145     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, true);
146     // post-processing
147     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_capture};
148     Test_->streamIds.push_back(Test_->streamId_preview);
149     Test_->streamIds.push_back(Test_->streamId_capture);
150     Test_->StopStream(Test_->captureIds, Test_->streamIds);
151     Test_->consumerMap_.clear();
152     std::cout << "==========[test log]check Capture: Next, switch to preview + video." << Test_->rc << std::endl;
153     // Configure two streams of information
154     Test_->intents = {Camera::PREVIEW, Camera::VIDEO};
155     Test_->StartStream(Test_->intents);
156     // Capture preview stream
157     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
158     // Capture video stream
159     Test_->StartCapture(Test_->streamId_video, Test_->captureId_video, false, true);
160     // post-processing
161     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_video};
162     Test_->streamIds.push_back(Test_->streamId_preview);
163     Test_->streamIds.push_back(Test_->streamId_video);
164     Test_->StopStream(Test_->captureIds, Test_->streamIds);
165 }
166 
167 /**
168   * @tc.name: video cannot capture
169   * @tc.desc: Preview + video, then capture a photo, expected not support.
170   * @tc.size: MediumTest
171   * @tc.type: Function
172   */
173 HWTEST_F(CaptureTest, Camera_Capture_0005, TestSize.Level2)
174 {
175     std::cout << "==========[test log]check Capture: Preview + video, then capture a photo." << std::endl;
176     std::cout << "==========[test log]check Capture: First, create Preview + video." << std::endl;
177     // Configure two streams of information
178     Test_->intents = {Camera::PREVIEW, Camera::VIDEO};
179     Test_->StartStream(Test_->intents);
180     // Capture preview stream
181     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
182     // Capture video stream
183     Test_->StartCapture(Test_->streamId_video, Test_->captureId_video, false, true);
184 
185     // Start the capture stream
186     std::shared_ptr<Camera::StreamInfo> streamInfo_capture = std::make_shared<Camera::StreamInfo>();
187     streamInfo_capture->streamId_ = Test_->streamId_capture;
188     streamInfo_capture->width_ = 640;
189     streamInfo_capture->height_ = 480;
190 #ifdef CAMERA_BUILT_ON_OHOS_LITE
191     streamInfo_capture->format_ = IMAGE_PIXEL_FORMAT_NV21;
192 #else
193     streamInfo_capture->format_ = PIXEL_FMT_YCRCB_420_SP;
194 #endif
195     streamInfo_capture->dataspace_ = 8;
196     streamInfo_capture->intent_ = Camera::STILL_CAPTURE;
197     streamInfo_capture->tunneledMode_ = 5;
198     std::shared_ptr<OHOS::Camera::Test::StreamConsumer> capture_consumer =
199         std::make_shared<OHOS::Camera::Test::StreamConsumer>();
200 #ifdef CAMERA_BUILT_ON_OHOS_LITE
__anonde0688610102(OHOS::SurfaceBuffer* buffer) 201     streamInfo_capture->bufferQueue_ = capture_consumer->CreateProducer([this](OHOS::SurfaceBuffer* buffer) {
202         Test_->SaveYUV("capture", buffer->GetVirAddr(), buffer->GetSize());
203     });
204 #else
__anonde0688610202(void* addr, uint32_t size) 205     streamInfo_capture->bufferQueue_ = capture_consumer->CreateProducer([this](void* addr, uint32_t size) {
206         Test_->SaveYUV("capture", addr, size);
207     });
208 #endif
209     streamInfo_capture->bufferQueue_->SetQueueSize(8);
210     Test_->consumerMap_[Camera::STILL_CAPTURE] = capture_consumer;
211     // Query whether the IsStreamsSupported interface supports
212     Camera::StreamSupportType pType;
213     std::shared_ptr<CameraMetadata> modeSetting =
214         std::make_shared<CameraMetadata>(2, 128);
215     int64_t expoTime = 0;
216     modeSetting->addEntry(OHOS_SENSOR_EXPOSURE_TIME, &expoTime, 1);
217     int64_t colorGains[4] = {0};
218     modeSetting->addEntry(OHOS_SENSOR_COLOR_CORRECTION_GAINS, &colorGains, 4);
219     std::vector<std::shared_ptr<Camera::StreamInfo>> stre;
220     stre.push_back(streamInfo_capture);
221     Test_->rc = Test_->streamOperator->IsStreamsSupported(Camera::NORMAL, modeSetting, stre, pType);
222     EXPECT_EQ(Test_->rc, Camera::NO_ERROR);
223     std::cout << "ptype = " << pType << std::endl;
224     EXPECT_EQ(true, pType == Camera::RE_CONFIGURED_REQUIRED);
225     // post-processing
226     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_video};
227     Test_->streamIds.push_back(Test_->streamId_preview);
228     Test_->streamIds.push_back(Test_->streamId_video);
229     Test_->StopStream(Test_->captureIds, Test_->streamIds);
230 }
231 
232 /**
233   * @tc.name: preview and capture
234   * @tc.desc: Commit 2 streams together, Preview and still_capture streams, isStreaming is false.
235   * @tc.size: MediumTest
236   * @tc.type: Function
237   */
238 HWTEST_F(CaptureTest, Camera_Capture_0006, TestSize.Level0)
239 {
240     std::cout << "==========[test log]check Capture: Commit 2 streams together,";
241     std::cout << "Preview and still_capture streams, isStreaming is false." << std::endl;
242     // Configure two streams of information
243     Test_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
244     Test_->StartStream(Test_->intents);
245     // Capture preview stream
246     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
247     // Capture the photo stream, single capture
248     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, false);
249     // post-processing
250     Test_->captureIds = {Test_->captureId_preview};
251     Test_->streamIds.push_back(Test_->streamId_preview);
252     Test_->streamIds.push_back(Test_->streamId_capture);
253     Test_->StopStream(Test_->captureIds, Test_->streamIds);
254 }
255 
256 /**
257   * @tc.name: preview and capture
258   * @tc.desc: Commit 2 streams together, Preview and still_capture streams, isStreaming is false,
259   * Do not stop the stream, multiple single capture
260   * @tc.size: MediumTest
261   * @tc.type: Function
262   */
263 HWTEST_F(CaptureTest, Camera_Capture_0007, TestSize.Level0)
264 {
265     std::cout << "==========[test log]check Capture: Commit 2 streams together,";
266     std::cout << "Preview and still_capture streams, isStreaming is false, multiple single capture" << std::endl;
267     // Configure two streams of information
268     Test_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
269     Test_->StartStream(Test_->intents);
270     // Capture preview stream
271     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
272     // Capture the photo stream, multiple single capture
273     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, false);
274     sleep(1);
275     Test_->StartCapture(Test_->streamId_capture, (Test_->captureId_capture) + 1, false, false);
276     sleep(1);
277     Test_->StartCapture(Test_->streamId_capture, (Test_->captureId_capture) + 2, false, false);
278     // post-processing
279     Test_->captureIds = {Test_->captureId_preview};
280     Test_->streamIds.push_back(Test_->streamId_preview);
281     Test_->streamIds.push_back(Test_->streamId_capture);
282     Test_->StopStream(Test_->captureIds, Test_->streamIds);
283 }
284 
285 /**
286   * @tc.name: preview and capture
287   * @tc.desc: Commit 2 streams in order, Preview and still_capture streams.
288   * @tc.size: MediumTest
289   * @tc.type: Function
290   */
291 HWTEST_F(CaptureTest, Camera_Capture_0010, TestSize.Level1)
292 {
293     std::cout << "==========[test log]Commit 2 streams in order, Preview and still_capture." << std::endl;
294     // start preview stream
295     Test_->intents = {Camera::PREVIEW};
296     Test_->StartStream(Test_->intents);
297     // Get preview
298     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
299     // start stream
300     Test_->intents = {Camera::STILL_CAPTURE};
301     Test_->StartStream(Test_->intents);
302     // Start capture
303     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
304     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, true);
305     // release stream
306     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_capture};
307     Test_->streamIds.push_back(Test_->streamId_preview);
308     Test_->streamIds.push_back(Test_->streamId_capture);
309     Test_->StopStream(Test_->captureIds, Test_->streamIds);
310 }
311 
312 /**
313   * @tc.name: preview and capture
314   * @tc.desc: Preview and still_capture streams, Commit 2 streams together, capture together, isStreaming is true.
315   * @tc.size: MediumTest
316   * @tc.type: Function
317   */
318 HWTEST_F(CaptureTest, Camera_Capture_0030, TestSize.Level2)
319 {
320     std::cout << "==========[test log]check Capture: Preview and still_capture streams,";
321     std::cout << " Commit 2 streams together, capture together, isStreaming is true." << std::endl;
322     // Configure two streams of information
323     Test_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
324     Test_->StartStream(Test_->intents);
325     // Capture preview stream
326     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
327     // Capture the photo stream, continuous capture
328     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, true);
329     // post-processing
330     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_capture};
331     Test_->streamIds.push_back(Test_->streamId_preview);
332     Test_->streamIds.push_back(Test_->streamId_capture);
333     Test_->StopStream(Test_->captureIds, Test_->streamIds);
334 }
335 
336 /**
337   * @tc.name: preview and capture
338   * @tc.desc: Preview and still_capture streams + 3A, Commit 2 streams together, capture together, isStreaming is true.
339   * @tc.size: MediumTest
340   * @tc.type: Function
341   */
342 HWTEST_F(CaptureTest, Camera_Capture_0040, TestSize.Level2)
343 {
344     std::cout << "==========[test log]check Capture: Preview and still_capture streams + 3A,";
345     std::cout << " Commit 2 streams together, capture together, isStreaming is true." << std::endl;
346     // Configure two streams of information
347     Test_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
348     Test_->StartStream(Test_->intents);
349     // Capture preview stream
350     Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
351     // Issue 3A parameters to increase exposure
352     std::shared_ptr<Camera::CameraSetting> meta = std::make_shared<Camera::CameraSetting>(100, 2000);
353     int32_t expo = 0xa0;
354     meta->addEntry(OHOS_CONTROL_AE_EXPOSURE_COMPENSATION, &expo, 1);
355     Test_->rc = Test_->cameraDevice->UpdateSettings(meta);
356     if (Test_->rc == Camera::NO_ERROR) {
357         std::cout << "==========[test log]check Capture: UpdateSettings success, for 10s." << std::endl;
358     } else {
359         std::cout << "==========[test log]check Capture: UpdateSettings fail, rc = " << Test_->rc << std::endl;
360     }
361     sleep(3); // sleep for 3 seconds
362     // Capture the photo stream, continuous capture
363     Test_->StartCapture(Test_->streamId_capture, Test_->captureId_capture, false, true);
364     // post-processing
365     Test_->captureIds = {Test_->captureId_preview, Test_->captureId_capture};
366     Test_->streamIds.push_back(Test_->streamId_preview);
367     Test_->streamIds.push_back(Test_->streamId_capture);
368     Test_->StopStream(Test_->captureIds, Test_->streamIds);
369 }