1 /*
2 * Copyright (c) 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 #include "camera_capture_test.h"
16
17 using namespace testing::ext;
18
SetUpTestCase(void)19 void CameraCaptureTest::SetUpTestCase(void)
20 {}
TearDownTestCase(void)21 void CameraCaptureTest::TearDownTestCase(void)
22 {}
SetUp(void)23 void CameraCaptureTest::SetUp(void)
24 {
25 if (cameraBase_ == nullptr)
26 cameraBase_ = std::make_shared<TestCameraBase>();
27 cameraBase_->Init();
28 }
TearDown(void)29 void CameraCaptureTest::TearDown(void)
30 {
31 cameraBase_->Close();
32 }
33
34 /**
35 * @tc.name: preview and capture
36 * @tc.desc: Commit 2 streams together, Preview and still_capture streams, isStreaming is true.
37 * @tc.level: Level1
38 * @tc.size: MediumTest
39 * @tc.type: Function
40 */
41 HWTEST_F(CameraCaptureTest, camera_capture_001, TestSize.Level1)
42 {
43 // Get the stream manager
44 cameraBase_->AchieveStreamOperator();
45 // start stream
46 cameraBase_->intents = {PREVIEW, STILL_CAPTURE};
47 cameraBase_->StartStream(cameraBase_->intents);
48 // Get preview
49 cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
50 cameraBase_->StartCapture(cameraBase_->STREAM_ID_CAPTURE, cameraBase_->CAPTURE_ID_CAPTURE, false, true);
51 // release stream
52 cameraBase_->captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, cameraBase_->CAPTURE_ID_CAPTURE};
53 cameraBase_->streamIds = {cameraBase_->STREAM_ID_PREVIEW, cameraBase_->STREAM_ID_CAPTURE};
54 cameraBase_->StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
55 }
56
57 /**
58 * @tc.name: preview and capture
59 * @tc.desc: Preview + capture, then close camera, and preview + capture again.
60 * @tc.level: Level1
61 * @tc.size: MediumTest
62 * @tc.type: Function
63 */
64 HWTEST_F(CameraCaptureTest, camera_capture_002, TestSize.Level1)
65 {
66 CAMERA_LOGD("Preview + capture, then close camera, and preview + capture again.");
67 // Get the stream manager
68 cameraBase_->AchieveStreamOperator();
69 // start stream
70 cameraBase_->intents = {PREVIEW, STILL_CAPTURE};
71 cameraBase_->StartStream(cameraBase_->intents);
72 // Get preview
73 cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
74 cameraBase_->StartCapture(cameraBase_->STREAM_ID_CAPTURE, cameraBase_->CAPTURE_ID_CAPTURE, false, true);
75 // release stream
76 cameraBase_->captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, cameraBase_->CAPTURE_ID_CAPTURE};
77 cameraBase_->streamIds = {cameraBase_->STREAM_ID_PREVIEW, cameraBase_->STREAM_ID_CAPTURE};
78 cameraBase_->StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
79
80 // the 2nd time
81 // Configure two streams of information
82 // Get the stream manager
83 cameraBase_->AchieveStreamOperator();
84 // start stream
85 cameraBase_->intents = {PREVIEW, STILL_CAPTURE};
86 cameraBase_->StartStream(cameraBase_->intents);
87 // Get preview
88 cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
89 cameraBase_->StartCapture(cameraBase_->STREAM_ID_CAPTURE, cameraBase_->CAPTURE_ID_CAPTURE, false, true);
90 // release stream
91 cameraBase_->captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, cameraBase_->CAPTURE_ID_CAPTURE};
92 cameraBase_->streamIds = {cameraBase_->STREAM_ID_PREVIEW, cameraBase_->STREAM_ID_CAPTURE};
93 cameraBase_->StopStream(cameraBase_->captureIds, cameraBase_->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 */
103 HWTEST_F(CameraCaptureTest, camera_capture_003, TestSize.Level1)
104 {
105 CAMERA_LOGD("Capture with 3A, success.");
106 // Get the stream manager
107 cameraBase_->AchieveStreamOperator();
108 // start stream
109 cameraBase_->intents = {PREVIEW, STILL_CAPTURE};
110 cameraBase_->StartStream(cameraBase_->intents);
111 // Get preview
112 cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
113 cameraBase_->StartCapture(cameraBase_->STREAM_ID_CAPTURE, cameraBase_->CAPTURE_ID_CAPTURE, false, true);
114 // Issue 3A parameters to increase exposure
115 std::shared_ptr<CameraSetting> meta = std::make_shared<CameraSetting>(100, 2000);
116 int32_t expo = 0xa0;
117 meta->addEntry(OHOS_CONTROL_AE_EXPOSURE_COMPENSATION, &expo, 1);
118 const int32_t deviceStreamId = cameraBase_->STREAM_ID_CAPTURE;
119 meta->addEntry(OHOS_CAMERA_STREAM_ID, &deviceStreamId, 1);
120 std::vector<uint8_t> setting;
121 MetadataUtils::ConvertMetadataToVec(meta, setting);
122 cameraBase_->rc = (CamRetCode)cameraBase_->cameraDevice->UpdateSettings(setting);
123 if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
124 CAMERA_LOGI("UpdateSettings success, for 10s.");
125 } else {
126 CAMERA_LOGE("UpdateSettings fail, rc = %{public}d", cameraBase_->rc);
127 }
128 // release stream
129 cameraBase_->captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, cameraBase_->CAPTURE_ID_CAPTURE};
130 cameraBase_->streamIds = {cameraBase_->STREAM_ID_PREVIEW, cameraBase_->STREAM_ID_CAPTURE};
131 cameraBase_->StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
132 }
133
134 /**
135 * @tc.name: preview and capture
136 * @tc.desc: Preview + capture, then switch to preview + video.
137 * @tc.level: Level1
138 * @tc.size: MediumTest
139 * @tc.type: Function
140 */
141 HWTEST_F(CameraCaptureTest, camera_capture_004, TestSize.Level1)
142 {
143 CAMERA_LOGD("Preview + capture, then switch to preview + video.");
144 CAMERA_LOGD("First, create preview + capture.");
145 // Get the stream manager
146 cameraBase_->AchieveStreamOperator();
147 // start stream
148 cameraBase_->intents = {PREVIEW, STILL_CAPTURE};
149 cameraBase_->StartStream(cameraBase_->intents);
150 // Get preview
151 cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
152 cameraBase_->StartCapture(cameraBase_->STREAM_ID_CAPTURE, cameraBase_->CAPTURE_ID_CAPTURE, false, true);
153 // release stream
154 cameraBase_->captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, cameraBase_->CAPTURE_ID_CAPTURE};
155 cameraBase_->streamIds = {cameraBase_->STREAM_ID_PREVIEW, cameraBase_->STREAM_ID_CAPTURE};
156 cameraBase_->StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
157 sleep(3);
158
159 CAMERA_LOGD("Next, switch to preview + video, rc = %{public}d", cameraBase_->rc);
160 // Get the stream manager
161 cameraBase_->AchieveStreamOperator();
162 // start stream
163 cameraBase_->intents = {PREVIEW, VIDEO};
164 cameraBase_->StartStream(cameraBase_->intents);
165 // Get preview
166 cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
167 cameraBase_->StartCapture(cameraBase_->STREAM_ID_VIDEO, cameraBase_->CAPTURE_ID_VIDEO, false, true);
168 // release stream
169 cameraBase_->captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, cameraBase_->CAPTURE_ID_VIDEO};
170 cameraBase_->streamIds = {cameraBase_->STREAM_ID_PREVIEW, cameraBase_->STREAM_ID_VIDEO};
171 cameraBase_->StopStream(cameraBase_->captureIds, cameraBase_->streamIds);
172 }
173
174 /**
175 * @tc.name: preview and capture
176 * @tc.desc: Commit 2 streams together, Preview and still_capture streams, isStreaming is false.
177 * @tc.level: Level1
178 * @tc.size: MediumTest
179 * @tc.type: Function
180 */
181 HWTEST_F(CameraCaptureTest, camera_capture_006, TestSize.Level1)
182 {
183 // Get the stream manager
184 cameraBase_->AchieveStreamOperator();
185 // start stream
186 cameraBase_->intents = {PREVIEW, STILL_CAPTURE};
187 cameraBase_->StartStream(cameraBase_->intents);
188 // Get preview
189 cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
190 cameraBase_->StartCapture(cameraBase_->STREAM_ID_CAPTURE, cameraBase_->CAPTURE_ID_CAPTURE, false, false);
191
192 sleep(3);
193 CAMERA_LOGD("frame off.");
194 cameraBase_->streamCustomerPreview_->ReceiveFrameOff();
195 cameraBase_->streamCustomerCapture_->ReceiveFrameOff();
196
197 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->ReleaseStreams(
198 {cameraBase_->STREAM_ID_CAPTURE});
199 EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
200 if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
201 CAMERA_LOGI("ReleaseStreams success.");
202 } else {
203 CAMERA_LOGE("ReleaseStreams fail, rc = %{public}d", cameraBase_->rc);
204 }
205 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->ReleaseStreams(
206 {cameraBase_->STREAM_ID_PREVIEW});
207 EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
208 if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
209 CAMERA_LOGI("ReleaseStreams success.");
210 } else {
211 CAMERA_LOGE("ReleaseStreams fail, rc = %{public}d", cameraBase_->rc);
212 }
213 }
214
215 /**
216 * @tc.name: preview and capture
217 * @tc.desc: Commit 2 streams in order, Preview and still_capture streams.
218 * @tc.level: Level1
219 * @tc.size: MediumTest
220 * @tc.type: Function
221 */
222 HWTEST_F(CameraCaptureTest, camera_capture_010, TestSize.Level1)
223 {
224 CAMERA_LOGD("Preview and still_capture streams.");
225 // Configure two streams of information
226 EXPECT_EQ(true, cameraBase_->cameraDevice != nullptr);
227 cameraBase_->AchieveStreamOperator();
228 // Configure capture stream information
229 cameraBase_->intents = {PREVIEW, STILL_CAPTURE};
230 cameraBase_->StartStream(cameraBase_->intents);
231 cameraBase_->StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true);
232 cameraBase_->StartCapture(cameraBase_->STREAM_ID_CAPTURE, cameraBase_->CAPTURE_ID_CAPTURE, false, true);
233 sleep(2);
234
235 // post-processing
236 cameraBase_->streamCustomerPreview_->ReceiveFrameOff();
237 cameraBase_->streamCustomerCapture_->ReceiveFrameOff();
238 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->CancelCapture(cameraBase_->CAPTURE_ID_CAPTURE);
239 EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
240 if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
241 CAMERA_LOGI("CancelCapture success.");
242 } else {
243 CAMERA_LOGE("CancelCapture fail, rc = %{public}d", cameraBase_->rc);
244 }
245 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->CancelCapture(cameraBase_->CAPTURE_ID_PREVIEW);
246 EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
247 if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
248 CAMERA_LOGI("CancelCapture success.");
249 } else {
250 CAMERA_LOGE("CancelCapture fail, rc = %{public}d", cameraBase_->rc);
251 }
252 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->ReleaseStreams(
253 {cameraBase_->STREAM_ID_CAPTURE});
254 EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
255 if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
256 CAMERA_LOGI("ReleaseStreams success.");
257 } else {
258 CAMERA_LOGE("ReleaseStreams fail, rc = %{public}d", cameraBase_->rc);
259 }
260 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->ReleaseStreams(
261 {cameraBase_->STREAM_ID_PREVIEW});
262 EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
263 if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
264 CAMERA_LOGI("ReleaseStreams success.");
265 } else {
266 CAMERA_LOGE("ReleaseStreams fail, rc = %{public}d", cameraBase_->rc);
267 }
268 }
269
270 /**
271 * @tc.name: Only Still_capture stream
272 * @tc.desc: Only Still_capture stream, capture->isStreaming = false.
273 * @tc.level: Level1
274 * @tc.size: MediumTest
275 * @tc.type: Function
276 */
277 HWTEST_F(CameraCaptureTest, camera_capture_020, TestSize.Level1)
278 {
279 CAMERA_LOGD("No preview, only still_capture.");
280 // start stream
281 cameraBase_->AchieveStreamOperator();
282 std::shared_ptr<StreamCustomer> streamCustomer = std::make_shared<StreamCustomer>();
283 OHOS::sptr<OHOS::IBufferProducer> producer = streamCustomer->CreateProducer();
284 producer->SetQueueSize(8); // buffer queue size
285 if (producer->GetQueueSize() != 8) { // buffer queue size
286 CAMERA_LOGE("~~~~~~~");
287 }
__anon05500aac0102(const unsigned char *addr, const uint32_t size) 288 streamCustomer->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) {
289 cameraBase_->StoreImage(addr, size);
290 });
291 std::vector<StreamInfo> streamInfos;
292 cameraBase_->streamInfo.streamId_ = 1001;
293 cameraBase_->streamInfo.width_ = 1280; // picture width
294 cameraBase_->streamInfo.height_ = 960; // picture height
295 cameraBase_->streamInfo.format_ = PIXEL_FMT_RGBA_8888;
296 cameraBase_->streamInfo.dataspace_ = 8; // picture dataspace
297 cameraBase_->streamInfo.intent_ = STILL_CAPTURE;
298 cameraBase_->streamInfo.tunneledMode_ = 5; // tunnel mode
299 cameraBase_->streamInfo.encodeType_ = ENCODE_TYPE_JPEG;
300 cameraBase_->streamInfo.bufferQueue_ = new BufferProducerSequenceable(producer);
301 ASSERT_NE(cameraBase_->streamInfo.bufferQueue_, nullptr);
302 streamInfos.push_back(cameraBase_->streamInfo);
303 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->CreateStreams(streamInfos);
304 CAMERA_LOGE("CreateStreams! rc:0x%x\n", cameraBase_->rc);
305
306 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->CommitStreams(NORMAL, cameraBase_->ability_);
307 CAMERA_LOGE("CommitStreams! rc:0x%x\n", cameraBase_->rc);
308 int captureId = 2001;
309 CaptureInfo captureInfo = {};
310 captureInfo.streamIds_ = {1001};
311 captureInfo.captureSetting_ = cameraBase_->ability_;
312 captureInfo.enableShutterCallback_ = false;
313
314 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->Capture(captureId, captureInfo, false);
315 CAMERA_LOGE("Capture! rc:0x%x\n", cameraBase_->rc);
316 sleep(3);
317 streamCustomer->ReceiveFrameOff();
318 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->CancelCapture(captureId);
319 CAMERA_LOGE("CancelCapture! rc:0x%x\n", cameraBase_->rc);
320 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->ReleaseStreams(captureInfo.streamIds_);
321 CAMERA_LOGE("ReleaseStreams! rc:0x%x\n", cameraBase_->rc);
322 }
323
324 /**
325 * @tc.name: Only Still_capture stream
326 * @tc.desc: Only Still_capture stream, capture->isStreaming = true.
327 * @tc.level: Level1
328 * @tc.size: MediumTest
329 * @tc.type: Function
330 */
331 HWTEST_F(CameraCaptureTest, camera_capture_021, TestSize.Level1)
332 {
333 CAMERA_LOGD("Still_capture stream, capture->isStreaming = true.");
334 // start stream
335 cameraBase_->AchieveStreamOperator();
336 std::shared_ptr<StreamCustomer> streamCustomer = std::make_shared<StreamCustomer>();
337 OHOS::sptr<OHOS::IBufferProducer> producer = streamCustomer->CreateProducer();
338 producer->SetQueueSize(8); // 8:set bufferqueue size
339 if (producer->GetQueueSize() != 8) { // 8:get bufferqueue size
340 CAMERA_LOGE("~~~~~~~");
341 }
__anon05500aac0202(const unsigned char *addr, const uint32_t size) 342 streamCustomer->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) {
343 cameraBase_->StoreImage(addr, size);
344 });
345 std::vector<StreamInfo> streamInfos;
346 cameraBase_->streamInfo.streamId_ = 1001;
347 cameraBase_->streamInfo.width_ = 1280; // 640:picture width
348 cameraBase_->streamInfo.height_ = 960; // 640:picture height
349 cameraBase_->streamInfo.format_ = PIXEL_FMT_RGBA_8888;
350 cameraBase_->streamInfo.dataspace_ = 8; // 8:picture dataspace
351 cameraBase_->streamInfo.intent_ = STILL_CAPTURE;
352 cameraBase_->streamInfo.tunneledMode_ = 5; // 5:tunnel mode
353 cameraBase_->streamInfo.encodeType_ = ENCODE_TYPE_JPEG;
354 cameraBase_->streamInfo.bufferQueue_ = new BufferProducerSequenceable(producer);
355 ASSERT_NE(cameraBase_->streamInfo.bufferQueue_, nullptr);
356 streamInfos.push_back(cameraBase_->streamInfo);
357 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->CreateStreams(streamInfos);
358 CAMERA_LOGE("CreateStreams! rc:0x%x\n", cameraBase_->rc);
359
360 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->CommitStreams(NORMAL, cameraBase_->ability_);
361 CAMERA_LOGE("CommitStreams! rc:0x%x\n", cameraBase_->rc);
362 int captureId = 2001;
363 CaptureInfo captureInfo = {};
364 captureInfo.streamIds_ = {1001};
365 captureInfo.captureSetting_ = cameraBase_->ability_;
366 captureInfo.enableShutterCallback_ = false;
367
368 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->Capture(captureId, captureInfo, true);
369 CAMERA_LOGE("Capture! rc:0x%x\n", cameraBase_->rc);
370 sleep(3);
371 streamCustomer->ReceiveFrameOff();
372 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->CancelCapture(captureId);
373 CAMERA_LOGE("CancelCapture! rc:0x%x\n", cameraBase_->rc);
374 cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->ReleaseStreams(captureInfo.streamIds_);
375 CAMERA_LOGE("ReleaseStreams! rc:0x%x\n", cameraBase_->rc);
376 EXPECT_EQ(true, cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR);
377 if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) {
378 CAMERA_LOGI("ReleaseStreams success.");
379 } else {
380 CAMERA_LOGE("ReleaseStreams fail, rc = %{public}d", cameraBase_->rc);
381 }
382 }