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}