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
17using namespace testing::ext;
18
19void CameraCaptureTest::SetUpTestCase(void)
20{}
21void CameraCaptureTest::TearDownTestCase(void)
22{}
23void CameraCaptureTest::SetUp(void)
24{
25    if (cameraBase_ == nullptr)
26    cameraBase_ = std::make_shared<TestCameraBase>();
27    cameraBase_->Init();
28}
29void 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  */
41HWTEST_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  */
64HWTEST_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  */
103HWTEST_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  */
141HWTEST_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  */
181HWTEST_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  */
222HWTEST_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  */
277HWTEST_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    }
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  */
331HWTEST_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    }
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}