1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file expected in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci#include "double_preview_test.h" 16094332d3Sopenharmony_ci 17094332d3Sopenharmony_ciusing namespace testing::ext; 18094332d3Sopenharmony_ciconstexpr uint32_t TIME_FOR_WAIT_CANCEL_CAPTURE = 2; 19094332d3Sopenharmony_ci 20094332d3Sopenharmony_civoid DoublePreviewTest::SetUpTestCase(void) 21094332d3Sopenharmony_ci{} 22094332d3Sopenharmony_civoid DoublePreviewTest::TearDownTestCase(void) 23094332d3Sopenharmony_ci{} 24094332d3Sopenharmony_civoid DoublePreviewTest::SetUp(void) 25094332d3Sopenharmony_ci{ 26094332d3Sopenharmony_ci if (cameraBase_ == nullptr) { 27094332d3Sopenharmony_ci cameraBase_ = std::make_shared<TestCameraBase>(); 28094332d3Sopenharmony_ci } 29094332d3Sopenharmony_ci cameraBase_->Init(); 30094332d3Sopenharmony_ci} 31094332d3Sopenharmony_civoid DoublePreviewTest::TearDown(void) 32094332d3Sopenharmony_ci{ 33094332d3Sopenharmony_ci cameraBase_->Close(); 34094332d3Sopenharmony_ci} 35094332d3Sopenharmony_ci 36094332d3Sopenharmony_civoid DoublePreviewTest::SetStreamInfo(StreamInfo &streamInfo, 37094332d3Sopenharmony_ci const std::shared_ptr<StreamCustomer> &streamCustomer, 38094332d3Sopenharmony_ci const int streamId, const StreamIntent intent) 39094332d3Sopenharmony_ci{ 40094332d3Sopenharmony_ci sptr<OHOS::IBufferProducer> producer; 41094332d3Sopenharmony_ci constexpr uint32_t DATA_SPACE = 8; // picture dataspace 42094332d3Sopenharmony_ci constexpr uint32_t TUNNEL_MODE = 5; // tunnel mode 43094332d3Sopenharmony_ci constexpr uint32_t BUFFER_QUEUE_SIZE = 8; // set bufferQueue size 44094332d3Sopenharmony_ci if (intent == PREVIEW) { 45094332d3Sopenharmony_ci streamInfo.width_ = PREVIEW_WIDTH; 46094332d3Sopenharmony_ci streamInfo.height_ = PREVIEW_HEIGHT; 47094332d3Sopenharmony_ci streamInfo.format_ = PIXEL_FMT_RGBA_8888; 48094332d3Sopenharmony_ci } 49094332d3Sopenharmony_ci streamInfo.streamId_ = streamId; 50094332d3Sopenharmony_ci streamInfo.dataspace_ = DATA_SPACE; 51094332d3Sopenharmony_ci streamInfo.intent_ = intent; 52094332d3Sopenharmony_ci streamInfo.tunneledMode_ = TUNNEL_MODE; 53094332d3Sopenharmony_ci producer = streamCustomer->CreateProducer(); 54094332d3Sopenharmony_ci streamInfo.bufferQueue_ = new BufferProducerSequenceable(producer); 55094332d3Sopenharmony_ci ASSERT_NE(streamInfo.bufferQueue_, nullptr); 56094332d3Sopenharmony_ci streamInfo.bufferQueue_->producer_->SetQueueSize(BUFFER_QUEUE_SIZE); 57094332d3Sopenharmony_ci} 58094332d3Sopenharmony_ci 59094332d3Sopenharmony_civoid DoublePreviewTest::CreateStream(int streamId, StreamIntent intent) 60094332d3Sopenharmony_ci{ 61094332d3Sopenharmony_ci StreamInfo streamInfo = {}; 62094332d3Sopenharmony_ci 63094332d3Sopenharmony_ci if (intent == PREVIEW) { 64094332d3Sopenharmony_ci if (streamId == cameraBase_->STREAM_ID_PREVIEW) { 65094332d3Sopenharmony_ci if (streamCustomerPreview_ == nullptr) { 66094332d3Sopenharmony_ci streamCustomerPreview_ = std::make_shared<StreamCustomer>(); 67094332d3Sopenharmony_ci SetStreamInfo(streamInfo, streamCustomerPreview_, streamId, intent); 68094332d3Sopenharmony_ci std::vector<StreamInfo>().swap(streamInfos_); 69094332d3Sopenharmony_ci streamInfos_.push_back(streamInfo); 70094332d3Sopenharmony_ci } 71094332d3Sopenharmony_ci } else if (streamId == STREAMID_PREVIEW_DOUBLE) { 72094332d3Sopenharmony_ci if (streamCustomerPreviewDouble_ == nullptr) { 73094332d3Sopenharmony_ci streamCustomerPreviewDouble_ = std::make_shared<StreamCustomer>(); 74094332d3Sopenharmony_ci SetStreamInfo(streamInfo, streamCustomerPreviewDouble_, streamId, intent); 75094332d3Sopenharmony_ci std::vector<StreamInfo>().swap(streamInfos_); 76094332d3Sopenharmony_ci streamInfos_.push_back(streamInfo); 77094332d3Sopenharmony_ci } 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci } 80094332d3Sopenharmony_ci result_ = (CamRetCode)cameraBase_->streamOperator->CreateStreams(streamInfos_); 81094332d3Sopenharmony_ci EXPECT_EQ(result_, HDI::Camera::V1_0::NO_ERROR); 82094332d3Sopenharmony_ci if (result_ == HDI::Camera::V1_0::NO_ERROR) { 83094332d3Sopenharmony_ci CAMERA_LOGI("CreateStreams success."); 84094332d3Sopenharmony_ci } else { 85094332d3Sopenharmony_ci CAMERA_LOGE("CreateStreams fail, result_ = %{public}d", result_); 86094332d3Sopenharmony_ci } 87094332d3Sopenharmony_ci} 88094332d3Sopenharmony_ci 89094332d3Sopenharmony_civoid DoublePreviewTest::CommitStream() 90094332d3Sopenharmony_ci{ 91094332d3Sopenharmony_ci result_ = (CamRetCode)cameraBase_->streamOperator->CommitStreams(NORMAL, cameraBase_->ability_); 92094332d3Sopenharmony_ci EXPECT_EQ(result_, HDI::Camera::V1_0::NO_ERROR); 93094332d3Sopenharmony_ci if (result_ == HDI::Camera::V1_0::NO_ERROR) { 94094332d3Sopenharmony_ci CAMERA_LOGI("CommitStreams preview success."); 95094332d3Sopenharmony_ci } else { 96094332d3Sopenharmony_ci CAMERA_LOGE("CommitStreams preview fail, result_ = %{public}d", result_); 97094332d3Sopenharmony_ci } 98094332d3Sopenharmony_ci} 99094332d3Sopenharmony_ci 100094332d3Sopenharmony_civoid DoublePreviewTest::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming) 101094332d3Sopenharmony_ci{ 102094332d3Sopenharmony_ci captureInfo_.streamIds_ = {streamId}; 103094332d3Sopenharmony_ci captureInfo_.captureSetting_ = cameraBase_->ability_; 104094332d3Sopenharmony_ci captureInfo_.enableShutterCallback_ = shutterCallback; 105094332d3Sopenharmony_ci constexpr uint32_t TIME_FOR_WAIT_IMAGE_PREVIEW = 2; // sleep two second 106094332d3Sopenharmony_ci result_ = (CamRetCode)cameraBase_->streamOperator->Capture(captureId, captureInfo_, isStreaming); 107094332d3Sopenharmony_ci EXPECT_EQ(result_, HDI::Camera::V1_0::NO_ERROR); 108094332d3Sopenharmony_ci if (result_ == HDI::Camera::V1_0::NO_ERROR) { 109094332d3Sopenharmony_ci CAMERA_LOGI("check Capture: Capture success, captureId = %{public}d", captureId); 110094332d3Sopenharmony_ci } else { 111094332d3Sopenharmony_ci CAMERA_LOGE("check Capture: Capture fail, captureId = %{public}d, result_ = %{public}d", captureId, result_); 112094332d3Sopenharmony_ci } 113094332d3Sopenharmony_ci if (captureId == cameraBase_->CAPTURE_ID_PREVIEW) { 114094332d3Sopenharmony_ci streamCustomerPreview_->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) { 115094332d3Sopenharmony_ci CAMERA_LOGI("preview size = %{public}u", size); 116094332d3Sopenharmony_ci }); 117094332d3Sopenharmony_ci } else if (captureId == CAPTUREID_PREVIEW_DOUBLE) { 118094332d3Sopenharmony_ci streamCustomerPreviewDouble_->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) { 119094332d3Sopenharmony_ci CAMERA_LOGI("preview double size = %{public}u", size); 120094332d3Sopenharmony_ci }); 121094332d3Sopenharmony_ci } else { 122094332d3Sopenharmony_ci CAMERA_LOGE("StartCapture ignore command"); 123094332d3Sopenharmony_ci } 124094332d3Sopenharmony_ci sleep(TIME_FOR_WAIT_IMAGE_PREVIEW); 125094332d3Sopenharmony_ci} 126094332d3Sopenharmony_ci 127094332d3Sopenharmony_civoid DoublePreviewTest::StopStream(std::vector<int> &captureIds, std::vector<int> &streamIds) 128094332d3Sopenharmony_ci{ 129094332d3Sopenharmony_ci sleep(TIME_FOR_WAIT_CANCEL_CAPTURE); 130094332d3Sopenharmony_ci if (captureIds.size() == 0) { 131094332d3Sopenharmony_ci return; 132094332d3Sopenharmony_ci } 133094332d3Sopenharmony_ci for (const auto &captureId : captureIds) { 134094332d3Sopenharmony_ci if (captureId == cameraBase_->CAPTURE_ID_PREVIEW) { 135094332d3Sopenharmony_ci streamCustomerPreview_->ReceiveFrameOff(); 136094332d3Sopenharmony_ci } else if (captureId == CAPTUREID_PREVIEW_DOUBLE) { 137094332d3Sopenharmony_ci streamCustomerPreviewDouble_->ReceiveFrameOff(); 138094332d3Sopenharmony_ci } else if (captureId == cameraBase_->CAPTURE_ID_CAPTURE) { 139094332d3Sopenharmony_ci cameraBase_->streamCustomerCapture_->ReceiveFrameOff(); 140094332d3Sopenharmony_ci } else if (captureId == cameraBase_->CAPTURE_ID_VIDEO) { 141094332d3Sopenharmony_ci cameraBase_->streamCustomerVideo_->ReceiveFrameOff(); 142094332d3Sopenharmony_ci sleep(TIME_FOR_WAIT_CANCEL_CAPTURE); 143094332d3Sopenharmony_ci cameraBase_->CloseFd(); 144094332d3Sopenharmony_ci } else { 145094332d3Sopenharmony_ci CAMERA_LOGE("StopStream ignore command."); 146094332d3Sopenharmony_ci } 147094332d3Sopenharmony_ci } 148094332d3Sopenharmony_ci for (auto &captureId : captureIds) { 149094332d3Sopenharmony_ci result_ = (CamRetCode)cameraBase_->streamOperator->CancelCapture(captureId); 150094332d3Sopenharmony_ci sleep(TIME_FOR_WAIT_CANCEL_CAPTURE); 151094332d3Sopenharmony_ci EXPECT_EQ(result_, HDI::Camera::V1_0::NO_ERROR); 152094332d3Sopenharmony_ci if (result_ == HDI::Camera::V1_0::NO_ERROR) { 153094332d3Sopenharmony_ci CAMERA_LOGI("check Capture: CancelCapture success, captureId = %{public}d", captureId); 154094332d3Sopenharmony_ci } else { 155094332d3Sopenharmony_ci CAMERA_LOGE("check Capture: CancelCapture fail, captureId = %{public}d, result_ = %{public}d", 156094332d3Sopenharmony_ci captureId, result_); 157094332d3Sopenharmony_ci } 158094332d3Sopenharmony_ci } 159094332d3Sopenharmony_ci} 160094332d3Sopenharmony_ci 161094332d3Sopenharmony_ci/** 162094332d3Sopenharmony_ci * @tc.name: double preview 163094332d3Sopenharmony_ci * @tc.desc: Commit 2 streams together, Double preview streams, isStreaming is true. 164094332d3Sopenharmony_ci * @tc.level: Level1 165094332d3Sopenharmony_ci * @tc.size: MediumTest 166094332d3Sopenharmony_ci * @tc.type: Function 167094332d3Sopenharmony_ci */ 168094332d3Sopenharmony_cistatic HWTEST_F(DoublePreviewTest, double_preview_001, TestSize.Level1) 169094332d3Sopenharmony_ci{ 170094332d3Sopenharmony_ci // Get the stream manager 171094332d3Sopenharmony_ci cameraBase_->AchieveStreamOperator(); 172094332d3Sopenharmony_ci 173094332d3Sopenharmony_ci // Start stream 174094332d3Sopenharmony_ci CreateStream(cameraBase_->STREAM_ID_PREVIEW, PREVIEW); 175094332d3Sopenharmony_ci CreateStream(STREAMID_PREVIEW_DOUBLE, PREVIEW); 176094332d3Sopenharmony_ci 177094332d3Sopenharmony_ci // Commit stream 178094332d3Sopenharmony_ci CommitStream(); 179094332d3Sopenharmony_ci 180094332d3Sopenharmony_ci // Get preview 181094332d3Sopenharmony_ci StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true); 182094332d3Sopenharmony_ci StartCapture(STREAMID_PREVIEW_DOUBLE, CAPTUREID_PREVIEW_DOUBLE, false, true); 183094332d3Sopenharmony_ci 184094332d3Sopenharmony_ci constexpr uint32_t TIME_FOR_WAIT_IMAGE_PREVIEW = 10; // sleep ten second 185094332d3Sopenharmony_ci sleep(TIME_FOR_WAIT_IMAGE_PREVIEW); 186094332d3Sopenharmony_ci 187094332d3Sopenharmony_ci std::vector<int> captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, CAPTUREID_PREVIEW_DOUBLE}; 188094332d3Sopenharmony_ci std::vector<int> streamIds = {cameraBase_->STREAM_ID_PREVIEW, STREAMID_PREVIEW_DOUBLE}; 189094332d3Sopenharmony_ci StopStream(captureIds, streamIds); 190094332d3Sopenharmony_ci} 191094332d3Sopenharmony_ci 192094332d3Sopenharmony_ci/** 193094332d3Sopenharmony_ci * @tc.name: double preview and still_capture 194094332d3Sopenharmony_ci * @tc.desc: Commit 3 streams together, Double preview and still_capture streams, isStreaming is true. 195094332d3Sopenharmony_ci * @tc.level: Level1 196094332d3Sopenharmony_ci * @tc.size: MediumTest 197094332d3Sopenharmony_ci * @tc.type: Function 198094332d3Sopenharmony_ci */ 199094332d3Sopenharmony_cistatic HWTEST_F(DoublePreviewTest, double_preview_002, TestSize.Level1) 200094332d3Sopenharmony_ci{ 201094332d3Sopenharmony_ci // Get the stream manager 202094332d3Sopenharmony_ci cameraBase_->AchieveStreamOperator(); 203094332d3Sopenharmony_ci 204094332d3Sopenharmony_ci // Start stream 205094332d3Sopenharmony_ci CreateStream(cameraBase_->STREAM_ID_PREVIEW, PREVIEW); 206094332d3Sopenharmony_ci CreateStream(STREAMID_PREVIEW_DOUBLE, PREVIEW); 207094332d3Sopenharmony_ci cameraBase_->intents = {STILL_CAPTURE}; 208094332d3Sopenharmony_ci cameraBase_->StartStream(cameraBase_->intents); 209094332d3Sopenharmony_ci 210094332d3Sopenharmony_ci // Get preview 211094332d3Sopenharmony_ci StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true); 212094332d3Sopenharmony_ci StartCapture(STREAMID_PREVIEW_DOUBLE, CAPTUREID_PREVIEW_DOUBLE, false, true); 213094332d3Sopenharmony_ci // add dumy exif info 214094332d3Sopenharmony_ci constexpr double latitude = 27.987500; // dummy data: Qomolangma latitde 215094332d3Sopenharmony_ci constexpr double longitude = 86.927500; // dummy data: Qomolangma longituude 216094332d3Sopenharmony_ci constexpr double altitude = 8848.86; // dummy data: Qomolangma altitude 217094332d3Sopenharmony_ci constexpr size_t entryCapacity = 100; 218094332d3Sopenharmony_ci constexpr size_t dataCapacity = 2000; 219094332d3Sopenharmony_ci std::shared_ptr<CameraSetting> captureSetting = 220094332d3Sopenharmony_ci std::make_shared<CameraSetting>(entryCapacity, dataCapacity); 221094332d3Sopenharmony_ci std::vector<double> gps; 222094332d3Sopenharmony_ci gps.push_back(latitude); 223094332d3Sopenharmony_ci gps.push_back(longitude); 224094332d3Sopenharmony_ci gps.push_back(altitude); 225094332d3Sopenharmony_ci captureSetting->addEntry(OHOS_JPEG_GPS_COORDINATES, gps.data(), gps.size()); 226094332d3Sopenharmony_ci std::vector<uint8_t> setting; 227094332d3Sopenharmony_ci MetadataUtils::ConvertMetadataToVec(captureSetting, setting); 228094332d3Sopenharmony_ci 229094332d3Sopenharmony_ci CaptureInfo captureInfo = {}; 230094332d3Sopenharmony_ci captureInfo.streamIds_ = {cameraBase_->STREAM_ID_CAPTURE}; 231094332d3Sopenharmony_ci captureInfo.captureSetting_ = setting; 232094332d3Sopenharmony_ci captureInfo.enableShutterCallback_ = false; 233094332d3Sopenharmony_ci cameraBase_->rc = (CamRetCode)cameraBase_->streamOperator->Capture(cameraBase_->CAPTURE_ID_CAPTURE, 234094332d3Sopenharmony_ci captureInfo, true); 235094332d3Sopenharmony_ci EXPECT_EQ(cameraBase_->rc, HDI::Camera::V1_0::NO_ERROR); 236094332d3Sopenharmony_ci if (cameraBase_->rc == HDI::Camera::V1_0::NO_ERROR) { 237094332d3Sopenharmony_ci CAMERA_LOGI("check Capture: Capture success, captureId = %{public}d", cameraBase_->CAPTURE_ID_CAPTURE); 238094332d3Sopenharmony_ci } else { 239094332d3Sopenharmony_ci CAMERA_LOGE("check Capture: Capture fail, captureId = %{public}d, rc = %{public}d", 240094332d3Sopenharmony_ci cameraBase_->CAPTURE_ID_CAPTURE, cameraBase_->rc); 241094332d3Sopenharmony_ci } 242094332d3Sopenharmony_ci cameraBase_->streamCustomerCapture_->ReceiveFrameOn([this](const unsigned char *addr, const uint32_t size) { 243094332d3Sopenharmony_ci cameraBase_->StoreImage(addr, size); 244094332d3Sopenharmony_ci }); 245094332d3Sopenharmony_ci 246094332d3Sopenharmony_ci constexpr uint32_t TIME_FOR_WAIT_IMAGE_PREVIEW = 5; // sleep five second 247094332d3Sopenharmony_ci sleep(TIME_FOR_WAIT_IMAGE_PREVIEW); 248094332d3Sopenharmony_ci 249094332d3Sopenharmony_ci std::vector<int> captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, CAPTUREID_PREVIEW_DOUBLE, 250094332d3Sopenharmony_ci cameraBase_->CAPTURE_ID_CAPTURE}; 251094332d3Sopenharmony_ci std::vector<int> streamIds = {cameraBase_->STREAM_ID_PREVIEW, STREAMID_PREVIEW_DOUBLE, 252094332d3Sopenharmony_ci cameraBase_->STREAM_ID_CAPTURE}; 253094332d3Sopenharmony_ci StopStream(captureIds, streamIds); 254094332d3Sopenharmony_ci} 255094332d3Sopenharmony_ci 256094332d3Sopenharmony_ci/** 257094332d3Sopenharmony_ci * @tc.name: double preview and video 258094332d3Sopenharmony_ci * @tc.desc: Commit 3 streams together, Double preview and video streams, isStreaming is true. 259094332d3Sopenharmony_ci * @tc.level: Level1 260094332d3Sopenharmony_ci * @tc.size: MediumTest 261094332d3Sopenharmony_ci * @tc.type: Function 262094332d3Sopenharmony_ci */ 263094332d3Sopenharmony_cistatic HWTEST_F(DoublePreviewTest, double_preview_003, TestSize.Level1) 264094332d3Sopenharmony_ci{ 265094332d3Sopenharmony_ci // Get the stream manager 266094332d3Sopenharmony_ci cameraBase_->AchieveStreamOperator(); 267094332d3Sopenharmony_ci 268094332d3Sopenharmony_ci // Start stream 269094332d3Sopenharmony_ci CreateStream(cameraBase_->STREAM_ID_PREVIEW, PREVIEW); 270094332d3Sopenharmony_ci CreateStream(STREAMID_PREVIEW_DOUBLE, PREVIEW); 271094332d3Sopenharmony_ci cameraBase_->intents = {VIDEO}; 272094332d3Sopenharmony_ci cameraBase_->StartStream(cameraBase_->intents); 273094332d3Sopenharmony_ci 274094332d3Sopenharmony_ci // Get preview 275094332d3Sopenharmony_ci StartCapture(cameraBase_->STREAM_ID_PREVIEW, cameraBase_->CAPTURE_ID_PREVIEW, false, true); 276094332d3Sopenharmony_ci StartCapture(STREAMID_PREVIEW_DOUBLE, CAPTUREID_PREVIEW_DOUBLE, false, true); 277094332d3Sopenharmony_ci cameraBase_->StartCapture(cameraBase_->STREAM_ID_VIDEO, cameraBase_->CAPTURE_ID_VIDEO, false, true); 278094332d3Sopenharmony_ci 279094332d3Sopenharmony_ci constexpr uint32_t TIME_FOR_WAIT_IMAGE_PREVIEW = 5; // sleep five second 280094332d3Sopenharmony_ci sleep(TIME_FOR_WAIT_IMAGE_PREVIEW); 281094332d3Sopenharmony_ci 282094332d3Sopenharmony_ci std::vector<int> captureIds = {cameraBase_->CAPTURE_ID_PREVIEW, CAPTUREID_PREVIEW_DOUBLE, 283094332d3Sopenharmony_ci cameraBase_->CAPTURE_ID_VIDEO}; 284094332d3Sopenharmony_ci std::vector<int> streamIds = {cameraBase_->STREAM_ID_PREVIEW, STREAMID_PREVIEW_DOUBLE, 285094332d3Sopenharmony_ci cameraBase_->STREAM_ID_VIDEO}; 286094332d3Sopenharmony_ci StopStream(captureIds, streamIds); 287094332d3Sopenharmony_ci} 288