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
SetUpTestCase(void)17 void UtestCaptureTest::SetUpTestCase(void)
18 {}
TearDownTestCase(void)19 void UtestCaptureTest::TearDownTestCase(void)
20 {}
SetUp(void)21 void UtestCaptureTest::SetUp(void)
22 {
23 if (display_ == nullptr)
24 display_ = std::make_shared<TestDisplay>();
25 display_->FBInit();
26 display_->Init();
27 }
TearDown(void)28 void UtestCaptureTest::TearDown(void)
29 {
30 display_->Close();
31 }
32
33 /**
34 * @tc.name: preview and capture
35 * @tc.desc: Commit 2 streams together, Preview and still_capture streams, isStreaming is true.
36 * @tc.level: Level0
37 * @tc.size: MediumTest
38 * @tc.type: Function
39 */
TEST_F(UtestCaptureTest,camera_capture_0001)40 TEST_F(UtestCaptureTest, camera_capture_0001)
41 {
42 // 获取流管理器
43 display_->AchieveStreamOperator();
44 // 启流
45 display_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
46 display_->StartStream(display_->intents);
47 // 获取预览图
48 display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, true);
49 display_->StartCapture(display_->streamId_capture, display_->captureId_preview, false, true);
50 // 释放流
51 display_->captureIds = {display_->captureId_preview};
52 display_->streamIds = {display_->streamId_preview, display_->streamId_capture};
53 display_->StopStream(display_->captureIds, display_->streamIds);
54 }
55
56 /**
57 * @tc.name: preview and capture
58 * @tc.desc: Preview + capture, then close camera, and preview + capture again.
59 * @tc.level: Level1
60 * @tc.size: MediumTest
61 * @tc.type: Function
62 */
TEST_F(UtestCaptureTest,camera_capture_0002)63 TEST_F(UtestCaptureTest, camera_capture_0002)
64 {
65 std::cout << "==========[test log] Preview + capture, then cloase camera,";
66 std::cout << "and preview + capture again." << std::endl;
67 // 获取流管理器
68 display_->AchieveStreamOperator();
69 // 启流
70 display_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
71 display_->StartStream(display_->intents);
72 // 获取预览图
73 display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, true);
74 display_->StartCapture(display_->streamId_capture, display_->captureId_preview, false, true);
75 // 释放流
76 display_->captureIds = {display_->captureId_preview};
77 display_->streamIds = {display_->streamId_preview, display_->streamId_capture};
78 display_->StopStream(display_->captureIds, display_->streamIds);
79
80 // the 2nd time
81 // 配置两路流信息
82 // 获取流管理器
83 display_->AchieveStreamOperator();
84 // 启流
85 display_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
86 display_->StartStream(display_->intents);
87 // 获取预览图
88 display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, true);
89 display_->StartCapture(display_->streamId_capture, display_->captureId_preview, false, true);
90 // 释放流
91 display_->captureIds = {display_->captureId_preview};
92 display_->streamIds = {display_->streamId_preview, display_->streamId_capture};
93 display_->StopStream(display_->captureIds, display_->streamIds);
94 }
95
96 /**
97 * @tc.name: preview and capture
98 * @tc.desc: Preview + capture with 3A, success.
99 * @tc.level: Level1
100 * @tc.size: MediumTest
101 * @tc.type: Function
102 */
TEST_F(UtestCaptureTest,camera_capture_0003)103 TEST_F(UtestCaptureTest, camera_capture_0003)
104 {
105 std::cout << "==========[test log] Capture with 3A, success." << std::endl;
106 // 获取流管理器
107 display_->AchieveStreamOperator();
108 // 启流
109 display_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
110 display_->StartStream(display_->intents);
111 // 获取预览图
112 display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, true);
113 display_->StartCapture(display_->streamId_capture, display_->captureId_preview, false, true);
114 // 下发3A参数,增加曝光度
115 std::shared_ptr<OHOS::Camera::CameraSetting> meta = std::make_shared<OHOS::Camera::CameraSetting>(100, 2000);
116 int32_t expo = 0xa0;
117 meta->addEntry(OHOS_CONTROL_AE_EXPOSURE_COMPENSATION, &expo, 1);
118 display_->rc = display_->cameraDevice->UpdateSettings(meta);
119 if (display_->rc == Camera::NO_ERROR) {
120 std::cout << "==========[test log] UpdateSettings success, for 10s." << std::endl;
121 } else {
122 std::cout << "==========[test log] UpdateSettings fail, rc = " << display_->rc << std::endl;
123 }
124 // 释放流
125 display_->captureIds = {display_->captureId_preview};
126 display_->streamIds = {display_->streamId_preview, display_->streamId_capture};
127 display_->StopStream(display_->captureIds, display_->streamIds);
128 }
129
130 /**
131 * @tc.name: preview and capture
132 * @tc.desc: Preview + capture, then switch to preview + video.
133 * @tc.level: Level1
134 * @tc.size: MediumTest
135 * @tc.type: Function
136 */
TEST_F(UtestCaptureTest,camera_capture_0004)137 TEST_F(UtestCaptureTest, camera_capture_0004)
138 {
139 std::cout << "==========[test log] Preview + capture, then switch to preview + video." << std::endl;
140 std::cout << "==========[test log] First, create preview + capture." << std::endl;
141 // 获取流管理器
142 display_->AchieveStreamOperator();
143 // 启流
144 display_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
145 display_->StartStream(display_->intents);
146 // 获取预览图
147 display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, true);
148 display_->StartCapture(display_->streamId_capture, display_->captureId_preview, false, true);
149 // 释放流
150 display_->captureIds = {display_->captureId_preview};
151 display_->streamIds = {display_->streamId_preview, display_->streamId_capture};
152 display_->StopStream(display_->captureIds, display_->streamIds);
153
154 std::cout << "==========[test log] Next, switch to preview + video." << display_->rc << std::endl;
155 // 获取流管理器
156 display_->AchieveStreamOperator();
157 // 启流
158 display_->intents = {Camera::PREVIEW, Camera::VIDEO};
159 display_->StartStream(display_->intents);
160 // 获取预览图
161 display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, true);
162 display_->StartCapture(display_->streamId_video, display_->captureId_preview, false, true);
163 // 释放流
164 display_->captureIds = {display_->captureId_preview};
165 display_->streamIds = {display_->streamId_preview, display_->streamId_video};
166 display_->StopStream(display_->captureIds, display_->streamIds);
167 }
168
169 /**
170 * @tc.name: preview and capture
171 * @tc.desc: Commit 2 streams together, Preview and still_capture streams, isStreaming is false.
172 * @tc.level: Level0
173 * @tc.size: MediumTest
174 * @tc.type: Function
175 */
TEST_F(UtestCaptureTest,camera_capture_0006)176 TEST_F(UtestCaptureTest, camera_capture_0006)
177 {
178 // 获取流管理器
179 display_->AchieveStreamOperator();
180 // 启流
181 display_->intents = {Camera::PREVIEW, Camera::STILL_CAPTURE};
182 display_->StartStream(display_->intents);
183 // 获取预览图
184 display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, false);
185 display_->StartCapture(display_->streamId_capture, display_->captureId_preview, false, false);
186 display_->captureIds = {display_->captureId_preview};
187 display_->streamIds = {display_->streamId_preview, display_->streamId_capture};
188 display_->StopStream(display_->captureIds, display_->streamIds);
189 }
190
191 /**
192 * @tc.name: preview and capture
193 * @tc.desc: Commit 2 streams in order, Preview and still_capture streams.
194 * @tc.level: Level1
195 * @tc.size: MediumTest
196 * @tc.type: Function
197 */
TEST_F(UtestCaptureTest,camera_capture_0010)198 TEST_F(UtestCaptureTest, camera_capture_0010)
199 {
200 std::cout << "==========[test log] Preview and still_capture streams." << std::endl;
201 // 配置两路流信息
202 EXPECT_EQ(true, display_->cameraDevice != nullptr);
203 display_->AchieveStreamOperator();
204 // 启流
205 display_->intents = {Camera::PREVIEW};
206 display_->StartStream(display_->intents);
207 // 抓拍
208 display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, true);
209
210 // 配置拍照流信息
211 display_->intents = {Camera::STILL_CAPTURE};
212 display_->StartStream(display_->intents);
213 // 抓拍
214 display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, true);
215 display_->StartCapture(display_->streamId_capture, display_->captureId_capture, false, true);
216
217 // 后处理
218 display_->rc = display_->streamOperator->CancelCapture(display_->captureId_capture);
219 EXPECT_EQ(true, display_->rc == Camera::NO_ERROR);
220 if (display_->rc == Camera::NO_ERROR) {
221 std::cout << "==========[test log] CancelCapture success." << std::endl;
222 } else {
223 std::cout << "==========[test log] CancelCapture fail, rc = ." << display_->rc << std::endl;
224 }
225 display_->rc = display_->streamOperator->CancelCapture(display_->captureId_preview);
226 EXPECT_EQ(true, display_->rc == Camera::NO_ERROR);
227 if (display_->rc == Camera::NO_ERROR) {
228 std::cout << "==========[test log] CancelCapture success." << std::endl;
229 } else {
230 std::cout << "==========[test log] CancelCapture fail, rc = ." << display_->rc << std::endl;
231 }
232 display_->rc = display_->streamOperator->ReleaseStreams({display_->streamId_capture});
233 EXPECT_EQ(true, display_->rc == Camera::NO_ERROR);
234 if (display_->rc == Camera::NO_ERROR) {
235 std::cout << "==========[test log] ReleaseStreams success." << std::endl;
236 } else {
237 std::cout << "==========[test log] ReleaseStreams fail, rc = ." << display_->rc << std::endl;
238 }
239 display_->rc = display_->streamOperator->ReleaseStreams({display_->streamId_preview});
240 EXPECT_EQ(true, display_->rc == Camera::NO_ERROR);
241 if (display_->rc == Camera::NO_ERROR) {
242 std::cout << "==========[test log] ReleaseStreams success." << std::endl;
243 } else {
244 std::cout << "==========[test log] ReleaseStreams fail, rc = ." << display_->rc << std::endl;
245 }
246 }
247
248 /**
249 * @tc.name: Only Still_capture stream
250 * @tc.desc: Only Still_capture stream, capture->isStreaming = false.
251 * @tc.level: Level1
252 * @tc.size: MediumTest
253 * @tc.type: Function
254 */
TEST_F(UtestCaptureTest,camera_capture_0020)255 TEST_F(UtestCaptureTest, camera_capture_0020)
256 {
257 std::cout << "==========[test log] No preview, only still_capture." << std::endl;
258 // 启流
259 display_->AchieveStreamOperator();
260 std::shared_ptr<IBufferProducer> producer = IBufferProducer::CreateBufferQueue();
261 producer->SetQueueSize(8); // 8:buffer queue size
262 if (producer->GetQueueSize() != 8) { // 8:buffer queue size
263 std::cout << "~~~~~~~" << std::endl;
264 }
265 auto callback = [this](std::shared_ptr<SurfaceBuffer> b) {
266 display_->BufferCallback(b, display_->capture_mode);
267 return;
268 };
269 producer->SetCallback(callback);
270 std::vector<std::shared_ptr<StreamInfo>> streamInfos;
271 display_->streamInfo = std::make_shared<OHOS::Camera::StreamInfo>();
272 display_->streamInfo->streamId_ = 1001;
273 display_->streamInfo->width_ = 640; // 640:picture width
274 display_->streamInfo->height_ = 480; // 640:picture height
275 display_->streamInfo->format_ = CAMERA_FORMAT_YUYV_422_PKG;
276 display_->streamInfo->datasapce_ = 8; // 8:picture datasapce
277 display_->streamInfo->intent_ = STILL_CAPTURE;
278 display_->streamInfo->tunneledMode_ = 5; // 5:tunnel mode
279 display_->streamInfo->bufferQueue_ = producer;
280 streamInfos.push_back(display_->streamInfo);
281 display_->rc = display_->streamOperator->CreateStreams(streamInfos);
282 CAMERA_LOGE("CreateStreams! rc:0x%x\n", display_->rc);
283
284 display_->rc = display_->streamOperator->CommitStreams(NORMAL, nullptr);
285 CAMERA_LOGE("CommitStreams! rc:0x%x\n", display_->rc);
286 int captureId = 2001;
287 std::shared_ptr<CaptureInfo> captureInfo = std::make_shared<CaptureInfo>();
288 captureInfo->streamIds_ = {1001};
289 captureInfo->enableShutterCallback_ = false;
290
291 display_->rc = display_->streamOperator->Capture(captureId, captureInfo, false);
292 CAMERA_LOGE("Capture! rc:0x%x\n", display_->rc);
293 sleep(5);
294 display_->rc = display_->streamOperator->CancelCapture(captureId);
295 CAMERA_LOGE("CancelCapture! rc:0x%x\n", display_->rc);
296 display_->rc = display_->streamOperator->ReleaseStreams(captureInfo->streamIds_);
297 CAMERA_LOGE("ReleaseStreams! rc:0x%x\n", display_->rc);
298 }
299
300 /**
301 * @tc.name: Only Still_capture stream
302 * @tc.desc: Only Still_capture stream, capture->isStreaming = true.
303 * @tc.level: Level1
304 * @tc.size: MediumTest
305 * @tc.type: Function
306 */
TEST_F(UtestCaptureTest,camera_capture_0021)307 TEST_F(UtestCaptureTest, camera_capture_0021)
308 {
309 std::cout << "==========[test log] Still_capture stream, capture->isStreaming = true." << std::endl;
310 // 启流
311 display_->AchieveStreamOperator();
312 std::shared_ptr<IBufferProducer> producer = IBufferProducer::CreateBufferQueue();
313 producer->SetQueueSize(8); // 8:set bufferqueue size
314 if (producer->GetQueueSize() != 8) { // 8:get bufferqueue size
315 std::cout << "~~~~~~~" << std::endl;
316 }
317 auto callback = [this](std::shared_ptr<SurfaceBuffer> b) {
318 display_->BufferCallback(b, display_->capture_mode);
319 return;
320 };
321 producer->SetCallback(callback);
322 std::vector<std::shared_ptr<StreamInfo>> streamInfos;
323 display_->streamInfo = std::make_shared<OHOS::Camera::StreamInfo>();
324 display_->streamInfo->streamId_ = 1001;
325 display_->streamInfo->width_ = 640; // 640:picture width
326 display_->streamInfo->height_ = 480; // 640:picture height
327 display_->streamInfo->format_ = CAMERA_FORMAT_YUYV_422_PKG;
328 display_->streamInfo->datasapce_ = 8; // 8:picture datasapce
329 display_->streamInfo->intent_ = STILL_CAPTURE;
330 display_->streamInfo->tunneledMode_ = 5; // 5:tunnel mode
331 display_->streamInfo->bufferQueue_ = producer;
332 streamInfos.push_back(display_->streamInfo);
333 display_->rc = display_->streamOperator->CreateStreams(streamInfos);
334 CAMERA_LOGE("CreateStreams! rc:0x%x\n", display_->rc);
335
336 display_->rc = display_->streamOperator->CommitStreams(NORMAL, nullptr);
337 CAMERA_LOGE("CommitStreams! rc:0x%x\n", display_->rc);
338 int captureId = 2001;
339 std::shared_ptr<CaptureInfo> captureInfo = std::make_shared<CaptureInfo>();
340 captureInfo->streamIds_ = {1001};
341 captureInfo->enableShutterCallback_ = false;
342
343 display_->rc = display_->streamOperator->Capture(captureId, captureInfo, true);
344 CAMERA_LOGE("Capture! rc:0x%x\n", display_->rc);
345 sleep(5);
346 display_->rc = display_->streamOperator->CancelCapture(captureId);
347 CAMERA_LOGE("CancelCapture! rc:0x%x\n", display_->rc);
348 display_->rc = display_->streamOperator->ReleaseStreams(captureInfo->streamIds_);
349 CAMERA_LOGE("ReleaseStreams! rc:0x%x\n", display_->rc);
350 EXPECT_EQ(true, display_->rc == Camera::NO_ERROR);
351 if (display_->rc == Camera::NO_ERROR) {
352 std::cout << "==========[test log] ReleaseStreams success." << std::endl;
353 } else {
354 std::cout << "==========[test log] ReleaseStreams fail, rc = ." << display_->rc << std::endl;
355 }
356 }