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 }