1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except 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 16094332d3Sopenharmony_ci#include <common.h> 17094332d3Sopenharmony_ci#include "camera.h" 18094332d3Sopenharmony_ci 19094332d3Sopenharmony_cinamespace OHOS::Camera { 20094332d3Sopenharmony_ciuint64_t Test::GetCurrentLocalTimeStamp() 21094332d3Sopenharmony_ci{ 22094332d3Sopenharmony_ci std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = 23094332d3Sopenharmony_ci std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); 24094332d3Sopenharmony_ci auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()); 25094332d3Sopenharmony_ci return static_cast<uint64_t>(tmp.count()); 26094332d3Sopenharmony_ci} 27094332d3Sopenharmony_ci 28094332d3Sopenharmony_civoid Test::CreateStreamOperatorCallback() 29094332d3Sopenharmony_ci{ 30094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 31094332d3Sopenharmony_ci streamOperatorCallback = std::make_shared<OHOS::Camera::HdiOperatorCallback>(this); 32094332d3Sopenharmony_ci#else 33094332d3Sopenharmony_ci streamOperatorCallback = new HdiOperatorCallback(this); 34094332d3Sopenharmony_ci#endif 35094332d3Sopenharmony_ci} 36094332d3Sopenharmony_ci 37094332d3Sopenharmony_civoid Test::CreateDeviceCallback() 38094332d3Sopenharmony_ci{ 39094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 40094332d3Sopenharmony_ci deviceCallback = std::make_shared<CameraDeviceCallback>(); 41094332d3Sopenharmony_ci#else 42094332d3Sopenharmony_ci deviceCallback = new CameraDeviceCallback(); 43094332d3Sopenharmony_ci#endif 44094332d3Sopenharmony_ci} 45094332d3Sopenharmony_ci 46094332d3Sopenharmony_civoid Test::CreateOfflineStreamOperatorCallback() 47094332d3Sopenharmony_ci{ 48094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 49094332d3Sopenharmony_ci offlineStreamOperatorCallback = std::make_shared<OHOS::Camera::StreamOperatorCallback>(); 50094332d3Sopenharmony_ci#else 51094332d3Sopenharmony_ci offlineStreamOperatorCallback = streamOperatorCallback; 52094332d3Sopenharmony_ci#endif 53094332d3Sopenharmony_ci} 54094332d3Sopenharmony_ci 55094332d3Sopenharmony_civoid Test::StreamInfoFormat() 56094332d3Sopenharmony_ci{ 57094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 58094332d3Sopenharmony_ci streamInfo->format_ = IMAGE_PIXEL_FORMAT_NV21; 59094332d3Sopenharmony_ci#else 60094332d3Sopenharmony_ci streamInfo->format_ = PIXEL_FMT_YCRCB_420_SP; 61094332d3Sopenharmony_ci#endif 62094332d3Sopenharmony_ci} 63094332d3Sopenharmony_ci 64094332d3Sopenharmony_ciint32_t Test::SaveYUV(const char* type, const void* buffer, int32_t size) 65094332d3Sopenharmony_ci{ 66094332d3Sopenharmony_ci if (strncmp(type, "preview", strlen(type)) == 0) { 67094332d3Sopenharmony_ci previewBufCnt += 1; 68094332d3Sopenharmony_ci if (previewBufCnt % 8 != 0) { // 8:Save one frame every eight frames 69094332d3Sopenharmony_ci std::cout << "receive preview buffer not save" << std::endl; 70094332d3Sopenharmony_ci return 0; 71094332d3Sopenharmony_ci } 72094332d3Sopenharmony_ci } 73094332d3Sopenharmony_ci char path[PATH_MAX] = {0}; 74094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 75094332d3Sopenharmony_ci if (strncmp(type, "preview", strlen(type)) == 0) { 76094332d3Sopenharmony_ci system("mkdir -p /userdata/camera"); 77094332d3Sopenharmony_ci char prefix[] = "/userdata/camera/"; 78094332d3Sopenharmony_ci 79094332d3Sopenharmony_ci if (sprintf_s(path, sizeof(path) / sizeof(path[0]), "%s%s_%lld.yuv", 80094332d3Sopenharmony_ci prefix, type, GetCurrentLocalTimeStamp()) < 0) { 81094332d3Sopenharmony_ci CAMERA_LOGE("%s: sprintf path failed", __func__); 82094332d3Sopenharmony_ci return 0; 83094332d3Sopenharmony_ci } 84094332d3Sopenharmony_ci } else { 85094332d3Sopenharmony_ci system("mkdir -p /userdata/camera"); 86094332d3Sopenharmony_ci char prefix[] = "/userdata/camera/"; 87094332d3Sopenharmony_ci 88094332d3Sopenharmony_ci if (sprintf_s(path, sizeof(path) / sizeof(path[0]), "%s%s_%lld.jpg", 89094332d3Sopenharmony_ci prefix, type, GetCurrentLocalTimeStamp()) < 0) { 90094332d3Sopenharmony_ci CAMERA_LOGE("%s: sprintf path failed", __func__); 91094332d3Sopenharmony_ci return 0; 92094332d3Sopenharmony_ci } 93094332d3Sopenharmony_ci } 94094332d3Sopenharmony_ci#else 95094332d3Sopenharmony_ci if (strncmp(type, "preview", strlen(type)) == 0) { 96094332d3Sopenharmony_ci system("mkdir -p /data/camera/preview"); 97094332d3Sopenharmony_ci char prefix[] = "/data/camera/preview/"; 98094332d3Sopenharmony_ci 99094332d3Sopenharmony_ci if (sprintf_s(path, sizeof(path) / sizeof(path[0]), "%s%s_%lld.yuv", 100094332d3Sopenharmony_ci prefix, type, GetCurrentLocalTimeStamp()) < 0) { 101094332d3Sopenharmony_ci CAMERA_LOGE("%s: sprintf path failed", __func__); 102094332d3Sopenharmony_ci return 0; 103094332d3Sopenharmony_ci } 104094332d3Sopenharmony_ci } else { 105094332d3Sopenharmony_ci system("mkdir -p /data/camera/capture"); 106094332d3Sopenharmony_ci char prefix[] = "/data/camera/capture/"; 107094332d3Sopenharmony_ci 108094332d3Sopenharmony_ci if (sprintf_s(path, sizeof(path) / sizeof(path[0]), "%s%s_%lld.jpg", 109094332d3Sopenharmony_ci prefix, type, GetCurrentLocalTimeStamp()) < 0) { 110094332d3Sopenharmony_ci CAMERA_LOGE("%s: sprintf path failed", __func__); 111094332d3Sopenharmony_ci return 0; 112094332d3Sopenharmony_ci } 113094332d3Sopenharmony_ci } 114094332d3Sopenharmony_ci#endif 115094332d3Sopenharmony_ci std::cout << "save yuv to file:" << path << std::endl; 116094332d3Sopenharmony_ci int imgFd = open(path, O_RDWR | O_CREAT | O_APPEND, 00766); // 00766:file jurisdiction 117094332d3Sopenharmony_ci if (imgFd == -1) { 118094332d3Sopenharmony_ci std::cout << "open file failed, errno = " << strerror(errno) << std::endl; 119094332d3Sopenharmony_ci return -1; 120094332d3Sopenharmony_ci } 121094332d3Sopenharmony_ci 122094332d3Sopenharmony_ci int32_t ret = write(imgFd, buffer, size); 123094332d3Sopenharmony_ci if (ret == -1) { 124094332d3Sopenharmony_ci std::cout << "write file failed, error = " << strerror(errno) << std::endl; 125094332d3Sopenharmony_ci close(imgFd); 126094332d3Sopenharmony_ci return -1; 127094332d3Sopenharmony_ci } 128094332d3Sopenharmony_ci close(imgFd); 129094332d3Sopenharmony_ci return 0; 130094332d3Sopenharmony_ci} 131094332d3Sopenharmony_ci 132094332d3Sopenharmony_ciint32_t Test::SaveVideoFile(const char* type, const void* buffer, int32_t size, int32_t operationMode) 133094332d3Sopenharmony_ci{ 134094332d3Sopenharmony_ci std::cout << "SaveVideoFile: operationMode = " << operationMode << " videoFd = "<< videoFd << std::endl; 135094332d3Sopenharmony_ci if (operationMode == 0) { 136094332d3Sopenharmony_ci char path[PATH_MAX] = {0}; 137094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 138094332d3Sopenharmony_ci system("mkdir -p /userdata/camera"); 139094332d3Sopenharmony_ci char prefix[] = "/userdata/camera/"; 140094332d3Sopenharmony_ci 141094332d3Sopenharmony_ci if (sprintf_s(path, sizeof(path) / sizeof(path[0]), "%s%s_%lld.h265", 142094332d3Sopenharmony_ci prefix, type, GetCurrentLocalTimeStamp()) < 0) { 143094332d3Sopenharmony_ci CAMERA_LOGE("%s: sprintf path failed", __func__); 144094332d3Sopenharmony_ci return 0; 145094332d3Sopenharmony_ci } 146094332d3Sopenharmony_ci#else 147094332d3Sopenharmony_ci system("mkdir -p /data/camera/video"); 148094332d3Sopenharmony_ci char prefix[] = "/data/camera/video/"; 149094332d3Sopenharmony_ci 150094332d3Sopenharmony_ci if (sprintf_s(path, sizeof(path) / sizeof(path[0]), "%s%s_%lld.h265", 151094332d3Sopenharmony_ci prefix, type, GetCurrentLocalTimeStamp()) < 0) { 152094332d3Sopenharmony_ci CAMERA_LOGE("%s: sprintf path failed", __func__); 153094332d3Sopenharmony_ci return 0; 154094332d3Sopenharmony_ci } 155094332d3Sopenharmony_ci#endif 156094332d3Sopenharmony_ci CAMERA_LOGI("%{public}s, save yuv to file %{public}s", __FUNCTION__, path); 157094332d3Sopenharmony_ci videoFd = open(path, O_RDWR | O_CREAT, 00766); // 00766:file jurisdiction 158094332d3Sopenharmony_ci if (videoFd == -1) { 159094332d3Sopenharmony_ci std::cout << "open file failed, errno = " << strerror(errno) << std::endl; 160094332d3Sopenharmony_ci return -1; 161094332d3Sopenharmony_ci } 162094332d3Sopenharmony_ci } else if (operationMode == 1 && videoFd != -1) { 163094332d3Sopenharmony_ci int32_t ret = write(videoFd, buffer, size); 164094332d3Sopenharmony_ci if (ret == -1) { 165094332d3Sopenharmony_ci std::cout << "write file failed, error = " << strerror(errno) << std::endl; 166094332d3Sopenharmony_ci close(videoFd); 167094332d3Sopenharmony_ci videoFd = -1; 168094332d3Sopenharmony_ci return -1; 169094332d3Sopenharmony_ci } 170094332d3Sopenharmony_ci } else { 171094332d3Sopenharmony_ci if (videoFd != -1) { 172094332d3Sopenharmony_ci close(videoFd); 173094332d3Sopenharmony_ci videoFd = -1; 174094332d3Sopenharmony_ci } 175094332d3Sopenharmony_ci } 176094332d3Sopenharmony_ci return 0; 177094332d3Sopenharmony_ci} 178094332d3Sopenharmony_ci 179094332d3Sopenharmony_civoid Test::Init() 180094332d3Sopenharmony_ci{ 181094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 182094332d3Sopenharmony_ci if (service == nullptr) { 183094332d3Sopenharmony_ci service = CameraHost::CreateCameraHost(); 184094332d3Sopenharmony_ci if (service == nullptr) { 185094332d3Sopenharmony_ci std::cout << "==========[test log]ICameraHost get failed."<< std::endl; 186094332d3Sopenharmony_ci } else { 187094332d3Sopenharmony_ci std::cout << "==========[test log]ICameraHost get success."<< std::endl; 188094332d3Sopenharmony_ci } 189094332d3Sopenharmony_ci } 190094332d3Sopenharmony_ci hostCallback = std::make_shared<HdiHostCallback>(this); 191094332d3Sopenharmony_ci#else 192094332d3Sopenharmony_ci if (service == nullptr) { 193094332d3Sopenharmony_ci service = ICameraHost::Get("camera_service"); 194094332d3Sopenharmony_ci if (service == nullptr) { 195094332d3Sopenharmony_ci std::cout << "==========[test log]ICameraHost get failed."<< std::endl; 196094332d3Sopenharmony_ci } else { 197094332d3Sopenharmony_ci std::cout << "==========[test log]ICameraHost get success."<< std::endl; 198094332d3Sopenharmony_ci } 199094332d3Sopenharmony_ci ASSERT_TRUE(service != nullptr); 200094332d3Sopenharmony_ci } 201094332d3Sopenharmony_ci hostCallback = new HdiHostCallback(this); 202094332d3Sopenharmony_ci#endif 203094332d3Sopenharmony_ci service->SetCallback(hostCallback); 204094332d3Sopenharmony_ci} 205094332d3Sopenharmony_ci 206094332d3Sopenharmony_civoid Test::GetCameraAbility() 207094332d3Sopenharmony_ci{ 208094332d3Sopenharmony_ci if (cameraDevice == nullptr) { 209094332d3Sopenharmony_ci rc = service->GetCameraIds(cameraIds); 210094332d3Sopenharmony_ci if (rc != Camera::NO_ERROR) { 211094332d3Sopenharmony_ci std::cout << "==========[test log]GetCameraIds failed." << std::endl; 212094332d3Sopenharmony_ci return; 213094332d3Sopenharmony_ci } else { 214094332d3Sopenharmony_ci std::cout << "==========[test log]GetCameraIds success." << std::endl; 215094332d3Sopenharmony_ci } 216094332d3Sopenharmony_ci GetCameraMetadata(); 217094332d3Sopenharmony_ci } 218094332d3Sopenharmony_ci} 219094332d3Sopenharmony_ci 220094332d3Sopenharmony_civoid Test::GetCameraMetadata() 221094332d3Sopenharmony_ci{ 222094332d3Sopenharmony_ci rc = service->GetCameraAbility(cameraIds.front(), ability); 223094332d3Sopenharmony_ci if (rc != Camera::NO_ERROR) { 224094332d3Sopenharmony_ci std::cout << "==========[test log]GetCameraAbility failed, rc = " << rc << std::endl; 225094332d3Sopenharmony_ci } 226094332d3Sopenharmony_ci common_metadata_header_t* data = ability->get(); 227094332d3Sopenharmony_ci camera_metadata_item_t entry; 228094332d3Sopenharmony_ci int ret = FindCameraMetadataItem(data, OHOS_CONTROL_AE_AVAILABLE_MODES, &entry); 229094332d3Sopenharmony_ci if (ret == 0) { 230094332d3Sopenharmony_ci std::cout << "==========[test log] get OHOS_CONTROL_AE_AVAILABLE_MODES success" << std::endl; 231094332d3Sopenharmony_ci } 232094332d3Sopenharmony_ci} 233094332d3Sopenharmony_ci 234094332d3Sopenharmony_civoid Test::Open() 235094332d3Sopenharmony_ci{ 236094332d3Sopenharmony_ci if (cameraDevice == nullptr) { 237094332d3Sopenharmony_ci service->GetCameraIds(cameraIds); 238094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 239094332d3Sopenharmony_ci deviceCallback = std::make_shared<HdiDeviceCallback>(this); 240094332d3Sopenharmony_ci#else 241094332d3Sopenharmony_ci deviceCallback = new HdiDeviceCallback(this); 242094332d3Sopenharmony_ci#endif 243094332d3Sopenharmony_ci rc = service->OpenCamera(cameraIds.front(), deviceCallback, cameraDevice); 244094332d3Sopenharmony_ci if (rc != Camera::NO_ERROR || cameraDevice == nullptr) { 245094332d3Sopenharmony_ci std::cout << "==========[test log]OpenCamera failed, rc = " << rc << std::endl; 246094332d3Sopenharmony_ci return; 247094332d3Sopenharmony_ci } 248094332d3Sopenharmony_ci std::cout << "==========[test log]OpenCamera success." << std::endl; 249094332d3Sopenharmony_ci GetCameraMetadata(); 250094332d3Sopenharmony_ci } 251094332d3Sopenharmony_ci} 252094332d3Sopenharmony_ci 253094332d3Sopenharmony_civoid Test::Close() 254094332d3Sopenharmony_ci{ 255094332d3Sopenharmony_ci if (cameraDevice != nullptr) { 256094332d3Sopenharmony_ci cameraDevice->Close(); 257094332d3Sopenharmony_ci std::cout << "cameraDevice->Close" << std::endl; 258094332d3Sopenharmony_ci cameraDevice = nullptr; 259094332d3Sopenharmony_ci } 260094332d3Sopenharmony_ci} 261094332d3Sopenharmony_ci 262094332d3Sopenharmony_civoid Test::StartStream(std::vector<Camera::StreamIntent> intents) 263094332d3Sopenharmony_ci{ 264094332d3Sopenharmony_ci EXPECT_EQ(true, cameraDevice != nullptr); 265094332d3Sopenharmony_ci CreateStreamOperatorCallback(); 266094332d3Sopenharmony_ci rc = cameraDevice->GetStreamOperator(streamOperatorCallback, streamOperator); 267094332d3Sopenharmony_ci EXPECT_EQ(true, rc == Camera::NO_ERROR); 268094332d3Sopenharmony_ci if (rc == Camera::NO_ERROR) { 269094332d3Sopenharmony_ci std::cout << "==========[test log]GetStreamOperator success." << std::endl; 270094332d3Sopenharmony_ci } else { 271094332d3Sopenharmony_ci std::cout << "==========[test log]GetStreamOperator fail, rc = " << rc << std::endl; 272094332d3Sopenharmony_ci } 273094332d3Sopenharmony_ci streamInfo = std::make_shared<Camera::StreamInfo>(); 274094332d3Sopenharmony_ci streamInfo_video = std::make_shared<Camera::StreamInfo>(); 275094332d3Sopenharmony_ci streamInfo_capture = std::make_shared<Camera::StreamInfo>(); 276094332d3Sopenharmony_ci for (const auto& intent : intents) { 277094332d3Sopenharmony_ci if (intent == 0) { 278094332d3Sopenharmony_ci streamInfo->streamId_ = streamId_preview; 279094332d3Sopenharmony_ci streamInfo->width_ = 640; // 640:width of stream 280094332d3Sopenharmony_ci streamInfo->height_ = 480; // 480: height of stream 281094332d3Sopenharmony_ci streamInfo->dataspace_ = 8; // 8:dataspace of stream 282094332d3Sopenharmony_ci streamInfo->intent_ = intent; 283094332d3Sopenharmony_ci streamInfo->tunneledMode_ = 5; // 5:tunneledMode of stream 284094332d3Sopenharmony_ci StreamInfoFormat(); 285094332d3Sopenharmony_ci std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>(); 286094332d3Sopenharmony_ci std::cout << "==========[test log]received a preview buffer ... 0" << std::endl; 287094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 288094332d3Sopenharmony_ci streamInfo->bufferQueue_ = consumer_pre->CreateProducer([this](OHOS::SurfaceBuffer* buffer) { 289094332d3Sopenharmony_ci SaveYUV("preview", buffer->GetVirAddr(), buffer->GetSize()); 290094332d3Sopenharmony_ci }); 291094332d3Sopenharmony_ci#else 292094332d3Sopenharmony_ci streamInfo->bufferQueue_ = consumer_pre->CreateProducer([this](void* addr, uint32_t size) { 293094332d3Sopenharmony_ci SaveYUV("preview", addr, size); 294094332d3Sopenharmony_ci }); 295094332d3Sopenharmony_ci#endif 296094332d3Sopenharmony_ci streamInfo->bufferQueue_->SetQueueSize(8); // 8:bufferqueue size 297094332d3Sopenharmony_ci consumerMap_[intent] = consumer_pre; 298094332d3Sopenharmony_ci streamInfos.push_back(streamInfo); 299094332d3Sopenharmony_ci } else if (intent == 1) { 300094332d3Sopenharmony_ci streamInfo_video->streamId_ = streamId_video; 301094332d3Sopenharmony_ci streamInfo_video->width_ = 1280; // 1280:width of stream 302094332d3Sopenharmony_ci streamInfo_video->height_ = 960; // 960: height of stream 303094332d3Sopenharmony_ci streamInfo_video->dataspace_ = 8; // 8:dataspace of stream 304094332d3Sopenharmony_ci streamInfo_video->intent_ = intent; 305094332d3Sopenharmony_ci streamInfo_video->encodeType_ = ENCODE_TYPE_H265; 306094332d3Sopenharmony_ci streamInfo_video->tunneledMode_ = 5; // 5:tunneledMode of stream 307094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 308094332d3Sopenharmony_ci streamInfo_video->format_ = IMAGE_PIXEL_FORMAT_NV21; 309094332d3Sopenharmony_ci#else 310094332d3Sopenharmony_ci streamInfo_video->format_ = PIXEL_FMT_YCRCB_420_SP; 311094332d3Sopenharmony_ci#endif 312094332d3Sopenharmony_ci std::shared_ptr<StreamConsumer> consumer_video = std::make_shared<StreamConsumer>(); 313094332d3Sopenharmony_ci std::cout << "==========[test log]received a video buffer ... 1" << std::endl; 314094332d3Sopenharmony_ci SaveVideoFile("video", nullptr, 0, 0); 315094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 316094332d3Sopenharmony_ci streamInfo_video->bufferQueue_ = consumer_video->CreateProducer([this](OHOS::SurfaceBuffer* buffer) { 317094332d3Sopenharmony_ci int32_t size = 0; 318094332d3Sopenharmony_ci buffer->GetInt32(OHOS::Camera::VIDEO_KEY_INFO_DATA_SIZE, size); 319094332d3Sopenharmony_ci SaveVideoFile("video", buffer->GetVirAddr(), size, 1); 320094332d3Sopenharmony_ci }); 321094332d3Sopenharmony_ci#else 322094332d3Sopenharmony_ci streamInfo_video->bufferQueue_ = consumer_video->CreateProducer([this](void* addr, uint32_t size) { 323094332d3Sopenharmony_ci SaveVideoFile("video", addr, size, 1); 324094332d3Sopenharmony_ci }); 325094332d3Sopenharmony_ci#endif 326094332d3Sopenharmony_ci streamInfo_video->bufferQueue_->SetQueueSize(8); // 8:bufferqueue size 327094332d3Sopenharmony_ci consumerMap_[intent] = consumer_video; 328094332d3Sopenharmony_ci streamInfos.push_back(streamInfo_video); 329094332d3Sopenharmony_ci } else { 330094332d3Sopenharmony_ci streamInfo_capture->streamId_ = streamId_capture; 331094332d3Sopenharmony_ci streamInfo_capture->width_ = 1280; // 1280:width of stream 332094332d3Sopenharmony_ci streamInfo_capture->height_ = 960; // 960: height of stream 333094332d3Sopenharmony_ci streamInfo_capture->dataspace_ = 8; // 8:dataspace of stream 334094332d3Sopenharmony_ci streamInfo_capture->intent_ = intent; 335094332d3Sopenharmony_ci streamInfo_capture->encodeType_ = ENCODE_TYPE_JPEG; 336094332d3Sopenharmony_ci streamInfo_capture->tunneledMode_ = 5; // 5:tunneledMode of stream 337094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 338094332d3Sopenharmony_ci streamInfo_capture->format_ = IMAGE_PIXEL_FORMAT_NV21; 339094332d3Sopenharmony_ci#else 340094332d3Sopenharmony_ci streamInfo_capture->format_ = PIXEL_FMT_YCRCB_420_SP; 341094332d3Sopenharmony_ci#endif 342094332d3Sopenharmony_ci std::shared_ptr<StreamConsumer> consumer_capture = std::make_shared<StreamConsumer>(); 343094332d3Sopenharmony_ci std::cout << "==========[test log]received a capture buffer ... 2" << std::endl; 344094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 345094332d3Sopenharmony_ci streamInfo_capture->bufferQueue_ = consumer_capture->CreateProducer([this](OHOS::SurfaceBuffer* buffer) { 346094332d3Sopenharmony_ci SaveYUV("capture", buffer->GetVirAddr(), buffer->GetSize()); 347094332d3Sopenharmony_ci }); 348094332d3Sopenharmony_ci#else 349094332d3Sopenharmony_ci streamInfo_capture->bufferQueue_ = consumer_capture->CreateProducer([this](void* addr, uint32_t size) { 350094332d3Sopenharmony_ci SaveYUV("capture", addr, size); 351094332d3Sopenharmony_ci }); 352094332d3Sopenharmony_ci#endif 353094332d3Sopenharmony_ci streamInfo_capture->bufferQueue_->SetQueueSize(8); // 8:bufferqueue size 354094332d3Sopenharmony_ci consumerMap_[intent] = consumer_capture; 355094332d3Sopenharmony_ci streamInfos.push_back(streamInfo_capture); 356094332d3Sopenharmony_ci } 357094332d3Sopenharmony_ci } 358094332d3Sopenharmony_ci rc = streamOperator->CreateStreams(streamInfos); 359094332d3Sopenharmony_ci EXPECT_EQ(false, rc != Camera::NO_ERROR); 360094332d3Sopenharmony_ci if (rc == Camera::NO_ERROR) { 361094332d3Sopenharmony_ci std::cout << "==========[test log]CreateStreams success." << std::endl; 362094332d3Sopenharmony_ci } else { 363094332d3Sopenharmony_ci std::cout << "==========[test log]CreateStreams fail, rc = " << rc << std::endl; 364094332d3Sopenharmony_ci } 365094332d3Sopenharmony_ci 366094332d3Sopenharmony_ci rc = streamOperator->CommitStreams(Camera::NORMAL, ability); 367094332d3Sopenharmony_ci EXPECT_EQ(false, rc != Camera::NO_ERROR); 368094332d3Sopenharmony_ci if (rc == Camera::NO_ERROR) { 369094332d3Sopenharmony_ci std::cout << "==========[test log]CommitStreams success." << std::endl; 370094332d3Sopenharmony_ci } else { 371094332d3Sopenharmony_ci std::cout << "==========[test log]CommitStreams fail, rc = " << rc << std::endl; 372094332d3Sopenharmony_ci } 373094332d3Sopenharmony_ci sleep(2); // 2:The program waits two seconds 374094332d3Sopenharmony_ci std::vector<std::shared_ptr<Camera::StreamInfo>>().swap(streamInfos); 375094332d3Sopenharmony_ci} 376094332d3Sopenharmony_ci 377094332d3Sopenharmony_civoid Test::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming) 378094332d3Sopenharmony_ci{ 379094332d3Sopenharmony_ci captureInfo = std::make_shared<Camera::CaptureInfo>(); 380094332d3Sopenharmony_ci captureInfo->streamIds_.push_back(streamId); 381094332d3Sopenharmony_ci captureInfo->captureSetting_ = ability; 382094332d3Sopenharmony_ci captureInfo->enableShutterCallback_ = shutterCallback; 383094332d3Sopenharmony_ci rc = streamOperator->Capture(captureId, captureInfo, isStreaming); 384094332d3Sopenharmony_ci EXPECT_EQ(true, rc == Camera::NO_ERROR); 385094332d3Sopenharmony_ci if (rc == Camera::NO_ERROR) { 386094332d3Sopenharmony_ci std::cout << "==========[test log]check Capture: Capture success, " << captureId << std::endl; 387094332d3Sopenharmony_ci } else { 388094332d3Sopenharmony_ci std::cout << "==========[test log]check Capture: Capture fail, rc = " << rc << std::endl; 389094332d3Sopenharmony_ci } 390094332d3Sopenharmony_ci sleep(1); // 1:Wait 1 seconds for the program to run 391094332d3Sopenharmony_ci} 392094332d3Sopenharmony_ci 393094332d3Sopenharmony_civoid Test::StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds) 394094332d3Sopenharmony_ci{ 395094332d3Sopenharmony_ci if (captureIds.size() > 0) { 396094332d3Sopenharmony_ci std::cout << "captureIds.size() = " << captureIds.size() << std::endl; 397094332d3Sopenharmony_ci for (auto &captureId : captureIds) { 398094332d3Sopenharmony_ci std::cout << "captureId = " << captureId << std::endl; 399094332d3Sopenharmony_ci rc = streamOperator->CancelCapture(captureId); 400094332d3Sopenharmony_ci EXPECT_EQ(true, rc == Camera::NO_ERROR); 401094332d3Sopenharmony_ci if (rc == Camera::NO_ERROR) { 402094332d3Sopenharmony_ci std::cout << "==========[test log]check Capture: CancelCapture success," << captureId << std::endl; 403094332d3Sopenharmony_ci } else { 404094332d3Sopenharmony_ci std::cout << "==========[test log]check Capture: CancelCapture fail, rc = " << rc << std::endl; 405094332d3Sopenharmony_ci std::cout << "captureId = " << captureId << std::endl; 406094332d3Sopenharmony_ci } 407094332d3Sopenharmony_ci if (captureId == captureId_preview) { 408094332d3Sopenharmony_ci captureId_preview++; 409094332d3Sopenharmony_ci } else if (captureId == captureId_capture) { 410094332d3Sopenharmony_ci captureId_capture++; 411094332d3Sopenharmony_ci } else if (captureId == captureId_video) { 412094332d3Sopenharmony_ci captureId_video++; 413094332d3Sopenharmony_ci } 414094332d3Sopenharmony_ci } 415094332d3Sopenharmony_ci } 416094332d3Sopenharmony_ci SaveVideoFile("video", nullptr, 0, 2); // 2:Operation Mode 417094332d3Sopenharmony_ci if (streamIds.size() > 0) { 418094332d3Sopenharmony_ci rc = streamOperator->ReleaseStreams(streamIds); 419094332d3Sopenharmony_ci EXPECT_EQ(true, rc == Camera::NO_ERROR); 420094332d3Sopenharmony_ci if (rc == Camera::NO_ERROR) { 421094332d3Sopenharmony_ci std::cout << "==========[test log]check Capture: ReleaseStreams success." << std::endl; 422094332d3Sopenharmony_ci } else { 423094332d3Sopenharmony_ci std::cout << "==========[test log]check Capture: ReleaseStreams fail, rc = " << rc << std::endl; 424094332d3Sopenharmony_ci } 425094332d3Sopenharmony_ci } 426094332d3Sopenharmony_ci streamIds.clear(); 427094332d3Sopenharmony_ci} 428094332d3Sopenharmony_ci 429094332d3Sopenharmony_civoid Test::StopConsumer(std::vector<Camera::StreamIntent> intents) 430094332d3Sopenharmony_ci{ 431094332d3Sopenharmony_ci for (const auto& intent : intents) { 432094332d3Sopenharmony_ci consumerMap_[intent]->StopConsumer(); 433094332d3Sopenharmony_ci } 434094332d3Sopenharmony_ci} 435094332d3Sopenharmony_ci 436094332d3Sopenharmony_civoid Test::StopOfflineStream(int captureId) 437094332d3Sopenharmony_ci{ 438094332d3Sopenharmony_ci captureId--; 439094332d3Sopenharmony_ci rc = offlineStreamOperator->CancelCapture(captureId); 440094332d3Sopenharmony_ci EXPECT_EQ(rc, Camera::NO_ERROR); 441094332d3Sopenharmony_ci if (rc == Camera::NO_ERROR) { 442094332d3Sopenharmony_ci std::cout << "==========[test log]check offline: CancelCapture success," << captureId << std::endl; 443094332d3Sopenharmony_ci } else { 444094332d3Sopenharmony_ci std::cout << "==========[test log]check offline: CancelCapture fail, rc = " << rc; 445094332d3Sopenharmony_ci std::cout << "captureId = " << captureId << std::endl; 446094332d3Sopenharmony_ci } 447094332d3Sopenharmony_ci rc = offlineStreamOperator->Release(); 448094332d3Sopenharmony_ci EXPECT_EQ(rc, Camera::NO_ERROR); 449094332d3Sopenharmony_ci if (rc == Camera::NO_ERROR) { 450094332d3Sopenharmony_ci std::cout << "==========[test log]Check offline stream: offline Release success." << std::endl; 451094332d3Sopenharmony_ci } else { 452094332d3Sopenharmony_ci std::cout << "==========[test log]Check offline stream: offline Release fail, rc = " << rc << std::endl; 453094332d3Sopenharmony_ci } 454094332d3Sopenharmony_ci} 455094332d3Sopenharmony_ci 456094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 457094332d3Sopenharmony_cistd::shared_ptr<OHOS::Surface> Test::StreamConsumer::CreateProducer(std::function<void(OHOS::SurfaceBuffer*)> callback) 458094332d3Sopenharmony_ci{ 459094332d3Sopenharmony_ci Surface* surface = OHOS::Surface::CreateSurface(); 460094332d3Sopenharmony_ci consumer_ = std::shared_ptr<OHOS::Surface>(surface); 461094332d3Sopenharmony_ci if (consumer_ == nullptr) { 462094332d3Sopenharmony_ci return nullptr; 463094332d3Sopenharmony_ci } 464094332d3Sopenharmony_ci callback_ = callback; 465094332d3Sopenharmony_ci 466094332d3Sopenharmony_ci consumerThread_ = new std::thread([this] { 467094332d3Sopenharmony_ci while (running_ == true) { 468094332d3Sopenharmony_ci OHOS::SurfaceBuffer* buffer = consumer_->AcquireBuffer(); 469094332d3Sopenharmony_ci if (buffer != nullptr) { 470094332d3Sopenharmony_ci if (callback_ != nullptr) { 471094332d3Sopenharmony_ci callback_(buffer); 472094332d3Sopenharmony_ci } 473094332d3Sopenharmony_ci consumer_->ReleaseBuffer(buffer); 474094332d3Sopenharmony_ci } 475094332d3Sopenharmony_ci } 476094332d3Sopenharmony_ci }); 477094332d3Sopenharmony_ci return consumer_; 478094332d3Sopenharmony_ci} 479094332d3Sopenharmony_ci#else 480094332d3Sopenharmony_ciOHOS::sptr<OHOS::IBufferProducer> Test::StreamConsumer::CreateProducer(std::function<void(void*, uint32_t)> callback) 481094332d3Sopenharmony_ci{ 482094332d3Sopenharmony_ci consumer_ = OHOS::Surface::CreateSurfaceAsConsumer(); 483094332d3Sopenharmony_ci if (consumer_ == nullptr) { 484094332d3Sopenharmony_ci return nullptr; 485094332d3Sopenharmony_ci } 486094332d3Sopenharmony_ci sptr<IBufferConsumerListener> listener = new TestBufferConsumerListener(); 487094332d3Sopenharmony_ci CHECK_IF_PTR_NULL_RETURN_VALUE(listener, nullptr); 488094332d3Sopenharmony_ci consumer_->RegisterConsumerListener(listener); 489094332d3Sopenharmony_ci auto producer = consumer_->GetProducer(); 490094332d3Sopenharmony_ci std::cout << "create a buffer queue producer:" << producer.GetRefPtr() << std::endl; 491094332d3Sopenharmony_ci if (producer == nullptr) { 492094332d3Sopenharmony_ci return nullptr; 493094332d3Sopenharmony_ci } 494094332d3Sopenharmony_ci callback_ = callback; 495094332d3Sopenharmony_ci running_ = true; 496094332d3Sopenharmony_ci consumerThread_ = new std::thread([this] { 497094332d3Sopenharmony_ci int32_t flushFence = 0; 498094332d3Sopenharmony_ci int64_t timestamp = 0; 499094332d3Sopenharmony_ci OHOS::Rect damage; 500094332d3Sopenharmony_ci OHOS::BufferRequestConfig config; 501094332d3Sopenharmony_ci while (running_ == true) { 502094332d3Sopenharmony_ci OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr; 503094332d3Sopenharmony_ci consumer_->AcquireBuffer(buffer, flushFence, timestamp, damage); 504094332d3Sopenharmony_ci if (buffer != nullptr) { 505094332d3Sopenharmony_ci void* addr = buffer->GetVirAddr(); 506094332d3Sopenharmony_ci uint32_t size = buffer->GetSize(); 507094332d3Sopenharmony_ci uint64_t pa = buffer->GetPhyAddr(); 508094332d3Sopenharmony_ci CAMERA_LOGI("consumer receive buffer add = %{public}llu", pa); 509094332d3Sopenharmony_ci if (callback_ != nullptr) { 510094332d3Sopenharmony_ci callback_(addr, size); 511094332d3Sopenharmony_ci } 512094332d3Sopenharmony_ci consumer_->ReleaseBuffer(buffer, -1); 513094332d3Sopenharmony_ci CAMERA_LOGI("consumer release buffer add = %{public}llu", pa); 514094332d3Sopenharmony_ci shotCount_--; 515094332d3Sopenharmony_ci if (shotCount_ == 0) { 516094332d3Sopenharmony_ci std::unique_lock<std::mutex> l(l_); 517094332d3Sopenharmony_ci cv_.notify_one(); 518094332d3Sopenharmony_ci } 519094332d3Sopenharmony_ci } 520094332d3Sopenharmony_ci if (running_ == false) { 521094332d3Sopenharmony_ci break; 522094332d3Sopenharmony_ci } 523094332d3Sopenharmony_ci } 524094332d3Sopenharmony_ci return; 525094332d3Sopenharmony_ci }); 526094332d3Sopenharmony_ci return producer; 527094332d3Sopenharmony_ci} 528094332d3Sopenharmony_ci#endif 529094332d3Sopenharmony_ci 530094332d3Sopenharmony_civoid Test::StreamConsumer::StopConsumer() 531094332d3Sopenharmony_ci{ 532094332d3Sopenharmony_ci running_ = false; 533094332d3Sopenharmony_ci} 534094332d3Sopenharmony_ci} 535