1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2023 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 16094332d3Sopenharmony_ci#include "hdi_common.h" 17094332d3Sopenharmony_ci#include "camera.h" 18094332d3Sopenharmony_ci#include "video_key_info.h" 19094332d3Sopenharmony_ci 20094332d3Sopenharmony_cinamespace OHOS::Camera { 21094332d3Sopenharmony_ciHdiCommon::ResultCallback HdiCommon::resultCallback_ = 0; 22094332d3Sopenharmony_ci 23094332d3Sopenharmony_ciuint64_t HdiCommon::GetCurrentLocalTimeStamp() 24094332d3Sopenharmony_ci{ 25094332d3Sopenharmony_ci std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = 26094332d3Sopenharmony_ci std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); 27094332d3Sopenharmony_ci auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()); 28094332d3Sopenharmony_ci return static_cast<uint64_t>(tmp.count()); 29094332d3Sopenharmony_ci} 30094332d3Sopenharmony_ci 31094332d3Sopenharmony_ciint32_t HdiCommon::DumpImageFile(int streamId, std::string suffix, const void* buffer, int32_t size) 32094332d3Sopenharmony_ci{ 33094332d3Sopenharmony_ci if (imageDataSaveSwitch == SWITCH_OFF) { 34094332d3Sopenharmony_ci return 0; 35094332d3Sopenharmony_ci } 36094332d3Sopenharmony_ci if (streamId < 0) { 37094332d3Sopenharmony_ci CAMERA_LOGE("ivalid stream id: %{public}d", streamId); 38094332d3Sopenharmony_ci return -1; 39094332d3Sopenharmony_ci } 40094332d3Sopenharmony_ci char mkdirCmd[PATH_MAX] = {0}; 41094332d3Sopenharmony_ci char path[PATH_MAX] = {0}; 42094332d3Sopenharmony_ci int ret = sprintf_s(mkdirCmd, sizeof(mkdirCmd) / sizeof(mkdirCmd[0]), 43094332d3Sopenharmony_ci "mkdir -p /data/stream-%d", streamId); 44094332d3Sopenharmony_ci if (ret < 0) { 45094332d3Sopenharmony_ci return -1; 46094332d3Sopenharmony_ci } 47094332d3Sopenharmony_ci system(mkdirCmd); 48094332d3Sopenharmony_ci ret = sprintf_s(path, sizeof(path) / sizeof(path[0]), "data/stream-%d/%lld.%s", 49094332d3Sopenharmony_ci streamId, GetCurrentLocalTimeStamp(), suffix.c_str()); 50094332d3Sopenharmony_ci if (ret < 0) { 51094332d3Sopenharmony_ci return -1; 52094332d3Sopenharmony_ci } 53094332d3Sopenharmony_ci 54094332d3Sopenharmony_ci int imgFd = open(path, O_RDWR | O_CREAT, 00766); 55094332d3Sopenharmony_ci if (imgFd == -1) { 56094332d3Sopenharmony_ci CAMERA_LOGE("open file failed, errno: %{public}s", strerror(errno)); 57094332d3Sopenharmony_ci return -1; 58094332d3Sopenharmony_ci } 59094332d3Sopenharmony_ci 60094332d3Sopenharmony_ci ret = write(imgFd, buffer, size); 61094332d3Sopenharmony_ci if (ret == -1) { 62094332d3Sopenharmony_ci CAMERA_LOGE("write file failed, error: %{public}s", strerror(errno)); 63094332d3Sopenharmony_ci close(imgFd); 64094332d3Sopenharmony_ci return -1; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci close(imgFd); 67094332d3Sopenharmony_ci return 0; 68094332d3Sopenharmony_ci} 69094332d3Sopenharmony_ci 70094332d3Sopenharmony_civoid HdiCommon::Init() 71094332d3Sopenharmony_ci{ 72094332d3Sopenharmony_ci if (service == nullptr) { 73094332d3Sopenharmony_ci service = ICameraHost::Get("camera_service", false); 74094332d3Sopenharmony_ci if (service == nullptr) { 75094332d3Sopenharmony_ci printf("ICameraHost get failed\n"); 76094332d3Sopenharmony_ci CAMERA_LOGE("ICameraHost get failed"); 77094332d3Sopenharmony_ci return; 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci } 80094332d3Sopenharmony_ci hostCallback = new TestCameraHostCallback(); 81094332d3Sopenharmony_ci service->SetCallback(hostCallback); 82094332d3Sopenharmony_ci} 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_civoid HdiCommon::GetCameraMetadata() 85094332d3Sopenharmony_ci{ 86094332d3Sopenharmony_ci rc = service->GetCameraAbility(cameraIds.front(), abilityVec); 87094332d3Sopenharmony_ci if (rc != HDI::Camera::V1_0::NO_ERROR) { 88094332d3Sopenharmony_ci printf("GetCameraAbility failed, rc = %d\n", rc); 89094332d3Sopenharmony_ci CAMERA_LOGE("GetCameraAbility failed, rc = %{public}d", rc); 90094332d3Sopenharmony_ci return; 91094332d3Sopenharmony_ci } 92094332d3Sopenharmony_ci MetadataUtils::ConvertVecToMetadata(abilityVec, ability); 93094332d3Sopenharmony_ci 94094332d3Sopenharmony_ci common_metadata_header_t* data = ability->get(); 95094332d3Sopenharmony_ci camera_metadata_item_t entry; 96094332d3Sopenharmony_ci int ret = FindCameraMetadataItem(data, OHOS_CONTROL_AE_AVAILABLE_MODES, &entry); 97094332d3Sopenharmony_ci camera_metadata_item_t connectEntry; 98094332d3Sopenharmony_ci ret = FindCameraMetadataItem(data, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &connectEntry); 99094332d3Sopenharmony_ci if (ret == HDI::Camera::V1_0::NO_ERROR && connectEntry.data.u8 != nullptr && connectEntry.count > 0) { 100094332d3Sopenharmony_ci uint8_t cameraConnectionType = *(connectEntry.data.u8); 101094332d3Sopenharmony_ci if (static_cast<int>(cameraConnectionType) == OHOS_CAMERA_CONNECTION_TYPE_USB_PLUGIN) { 102094332d3Sopenharmony_ci CAMERA_LOGI("get OHOS_ABILITY_CAMERA_CONNECTION_TYPE success, this camera is usb camera."); 103094332d3Sopenharmony_ci previewWidth = usbCamera_previewWidth; 104094332d3Sopenharmony_ci previewHeight = usbCamera_previewHeight; 105094332d3Sopenharmony_ci videoWidth = usbCamera_videoWidth; 106094332d3Sopenharmony_ci videoHeight = usbCamera_videoHeight; 107094332d3Sopenharmony_ci captureWidth = usbCamera_captureWidth; 108094332d3Sopenharmony_ci captureHeight = usbCamera_captureHeight; 109094332d3Sopenharmony_ci analyzeWidth = usbCamera_analyzeWidth; 110094332d3Sopenharmony_ci analyzeHeight = usbCamera_analyzeHeight; 111094332d3Sopenharmony_ci previewFormat = usbCamera_previewFormat; 112094332d3Sopenharmony_ci videoFormat = usbCamera_videoFormat; 113094332d3Sopenharmony_ci snapshotFormat = usbCamera_snapshotFormat; 114094332d3Sopenharmony_ci analyzeFormat = usbCamera_analyzeFormat; 115094332d3Sopenharmony_ci videoEncodeType = usbCamera_videoEncodeType; 116094332d3Sopenharmony_ci } 117094332d3Sopenharmony_ci } 118094332d3Sopenharmony_ci} 119094332d3Sopenharmony_ci 120094332d3Sopenharmony_civoid HdiCommon::Open() 121094332d3Sopenharmony_ci{ 122094332d3Sopenharmony_ci if (cameraDevice == nullptr) { 123094332d3Sopenharmony_ci service->GetCameraIds(cameraIds); 124094332d3Sopenharmony_ci if (cameraIds.size() == 0) { 125094332d3Sopenharmony_ci printf("camera device list empty\n"); 126094332d3Sopenharmony_ci CAMERA_LOGE("camera device list empty"); 127094332d3Sopenharmony_ci return; 128094332d3Sopenharmony_ci } 129094332d3Sopenharmony_ci GetCameraMetadata(); 130094332d3Sopenharmony_ci deviceCallback = new OHOS::Camera::HdiCommon::DemoCameraDeviceCallback(); 131094332d3Sopenharmony_ci rc = service->OpenCamera(cameraIds.front(), deviceCallback, cameraDevice); 132094332d3Sopenharmony_ci if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDevice == nullptr) { 133094332d3Sopenharmony_ci printf("openCamera failed, rc = %d\n", rc); 134094332d3Sopenharmony_ci CAMERA_LOGE("openCamera failed, rc = %{public}d", rc); 135094332d3Sopenharmony_ci return; 136094332d3Sopenharmony_ci } 137094332d3Sopenharmony_ci CAMERA_LOGI("OpenCamera success"); 138094332d3Sopenharmony_ci } 139094332d3Sopenharmony_ci} 140094332d3Sopenharmony_ci 141094332d3Sopenharmony_civoid HdiCommon::Close() 142094332d3Sopenharmony_ci{ 143094332d3Sopenharmony_ci if (cameraDevice != nullptr) { 144094332d3Sopenharmony_ci cameraDevice->Close(); 145094332d3Sopenharmony_ci cameraDevice = nullptr; 146094332d3Sopenharmony_ci } 147094332d3Sopenharmony_ci} 148094332d3Sopenharmony_ci 149094332d3Sopenharmony_civoid HdiCommon::DefaultPreview(std::shared_ptr<StreamInfo> &infos) 150094332d3Sopenharmony_ci{ 151094332d3Sopenharmony_ci infos->streamId_ = streamIdPreview; 152094332d3Sopenharmony_ci infos->width_ = previewWidth; 153094332d3Sopenharmony_ci infos->height_ = previewHeight; 154094332d3Sopenharmony_ci infos->format_ = previewFormat; 155094332d3Sopenharmony_ci infos->dataspace_ = UT_DATA_SIZE; 156094332d3Sopenharmony_ci infos->intent_ = StreamIntent::PREVIEW; 157094332d3Sopenharmony_ci infos->tunneledMode_ = UT_TUNNEL_MODE; 158094332d3Sopenharmony_ci} 159094332d3Sopenharmony_ci 160094332d3Sopenharmony_civoid HdiCommon::DefaultCapture(std::shared_ptr<StreamInfo> &infos) 161094332d3Sopenharmony_ci{ 162094332d3Sopenharmony_ci infos->streamId_ = streamIdCapture; 163094332d3Sopenharmony_ci infos->width_ = captureWidth; 164094332d3Sopenharmony_ci infos->height_ = captureHeight; 165094332d3Sopenharmony_ci infos->format_ = snapshotFormat; 166094332d3Sopenharmony_ci infos->dataspace_ = UT_DATA_SIZE; 167094332d3Sopenharmony_ci infos->intent_ = StreamIntent::STILL_CAPTURE; 168094332d3Sopenharmony_ci infos->tunneledMode_ = UT_TUNNEL_MODE; 169094332d3Sopenharmony_ci} 170094332d3Sopenharmony_ci 171094332d3Sopenharmony_civoid HdiCommon::DefaultInfosPreview(std::shared_ptr<StreamInfo> &infos) 172094332d3Sopenharmony_ci{ 173094332d3Sopenharmony_ci DefaultPreview(infos); 174094332d3Sopenharmony_ci std::shared_ptr<OHOS::Camera::HdiCommon::StreamConsumer> consumer_pre = 175094332d3Sopenharmony_ci std::make_shared<OHOS::Camera::HdiCommon::StreamConsumer>(); 176094332d3Sopenharmony_ci infos->bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) { 177094332d3Sopenharmony_ci DumpImageFile(streamIdPreview, "yuv", addr, size); 178094332d3Sopenharmony_ci }); 179094332d3Sopenharmony_ci infos->bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE); 180094332d3Sopenharmony_ci consumerMap_[StreamIntent::PREVIEW] = consumer_pre; 181094332d3Sopenharmony_ci} 182094332d3Sopenharmony_ci 183094332d3Sopenharmony_civoid HdiCommon::DefaultInfosCapture(std::shared_ptr<StreamInfo> &infos) 184094332d3Sopenharmony_ci{ 185094332d3Sopenharmony_ci DefaultCapture(infos); 186094332d3Sopenharmony_ci std::shared_ptr<OHOS::Camera::HdiCommon::StreamConsumer> consumer_capture = 187094332d3Sopenharmony_ci std::make_shared<OHOS::Camera::HdiCommon::StreamConsumer>(); 188094332d3Sopenharmony_ci infos->bufferQueue_ = consumer_capture->CreateProducerSeq([this](void* addr, uint32_t size) { 189094332d3Sopenharmony_ci DumpImageFile(streamIdPreview, "yuv", addr, size); 190094332d3Sopenharmony_ci }); 191094332d3Sopenharmony_ci infos->bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE); 192094332d3Sopenharmony_ci consumerMap_[StreamIntent::PREVIEW] = consumer_capture; 193094332d3Sopenharmony_ci} 194094332d3Sopenharmony_ci 195094332d3Sopenharmony_civoid HdiCommon::DefaultInfosVideo(std::shared_ptr<StreamInfo> &infos) 196094332d3Sopenharmony_ci{ 197094332d3Sopenharmony_ci infos->streamId_ = streamIdVideo; 198094332d3Sopenharmony_ci infos->width_ = videoWidth; 199094332d3Sopenharmony_ci infos->height_ = videoHeight; 200094332d3Sopenharmony_ci infos->format_ = videoFormat; 201094332d3Sopenharmony_ci infos->dataspace_ = UT_DATA_SIZE; 202094332d3Sopenharmony_ci infos->intent_ = StreamIntent::VIDEO; 203094332d3Sopenharmony_ci infos->encodeType_ = static_cast<OHOS::HDI::Camera::V1_0::EncodeType>(videoEncodeType); 204094332d3Sopenharmony_ci infos->tunneledMode_ = UT_TUNNEL_MODE; 205094332d3Sopenharmony_ci std::shared_ptr<OHOS::Camera::HdiCommon::StreamConsumer> consumer_video = 206094332d3Sopenharmony_ci std::make_shared<OHOS::Camera::HdiCommon::StreamConsumer>(); 207094332d3Sopenharmony_ci infos->bufferQueue_ = consumer_video->CreateProducerSeq([this](void* addr, uint32_t size) { 208094332d3Sopenharmony_ci DumpImageFile(streamIdVideo, "yuv", addr, size); 209094332d3Sopenharmony_ci }); 210094332d3Sopenharmony_ci infos->bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE); 211094332d3Sopenharmony_ci consumerMap_[StreamIntent::VIDEO] = consumer_video; 212094332d3Sopenharmony_ci} 213094332d3Sopenharmony_ci 214094332d3Sopenharmony_civoid HdiCommon::DefaultInfosAnalyze(std::shared_ptr<StreamInfo> &infos) 215094332d3Sopenharmony_ci{ 216094332d3Sopenharmony_ci infos->streamId_ = streamIdAnalyze; 217094332d3Sopenharmony_ci infos->width_ = analyzeWidth; 218094332d3Sopenharmony_ci infos->height_ = analyzeHeight; 219094332d3Sopenharmony_ci infos->format_ = analyzeFormat; 220094332d3Sopenharmony_ci infos->dataspace_ = UT_DATA_SIZE; 221094332d3Sopenharmony_ci infos->intent_ = StreamIntent::ANALYZE; 222094332d3Sopenharmony_ci infos->tunneledMode_ = UT_TUNNEL_MODE; 223094332d3Sopenharmony_ci 224094332d3Sopenharmony_ci std::shared_ptr<OHOS::Camera::HdiCommon::StreamConsumer> consumer_analyze = 225094332d3Sopenharmony_ci std::make_shared<OHOS::Camera::HdiCommon::StreamConsumer>(); 226094332d3Sopenharmony_ci infos->bufferQueue_ = consumer_analyze->CreateProducerSeq([this](void* addr, uint32_t size) { 227094332d3Sopenharmony_ci common_metadata_header_t *data = static_cast<common_metadata_header_t *>(addr); 228094332d3Sopenharmony_ci camera_metadata_item_t entry = {}; 229094332d3Sopenharmony_ci 230094332d3Sopenharmony_ci int ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_IDS, &entry); 231094332d3Sopenharmony_ci if (ret == 0) { 232094332d3Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 233094332d3Sopenharmony_ci int id = entry.data.i32[i]; 234094332d3Sopenharmony_ci CAMERA_LOGI("Face ids : %{public}d", id); 235094332d3Sopenharmony_ci } 236094332d3Sopenharmony_ci } 237094332d3Sopenharmony_ci 238094332d3Sopenharmony_ci ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_RECTANGLES, &entry); 239094332d3Sopenharmony_ci if (ret == 0) { 240094332d3Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 241094332d3Sopenharmony_ci int id = entry.data.i32[i]; 242094332d3Sopenharmony_ci CAMERA_LOGI("Face rectangles : %{public}d", id); 243094332d3Sopenharmony_ci } 244094332d3Sopenharmony_ci } 245094332d3Sopenharmony_ci }); 246094332d3Sopenharmony_ci infos->bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE); 247094332d3Sopenharmony_ci consumerMap_[StreamIntent::ANALYZE] = consumer_analyze; 248094332d3Sopenharmony_ci} 249094332d3Sopenharmony_ci 250094332d3Sopenharmony_civoid HdiCommon::StartStream(std::vector<StreamIntent> intents) 251094332d3Sopenharmony_ci{ 252094332d3Sopenharmony_ci streamOperatorCallback = new TestStreamOperatorCallback(); 253094332d3Sopenharmony_ci rc = cameraDevice->GetStreamOperator(streamOperatorCallback, streamOperator); 254094332d3Sopenharmony_ci if (rc != HDI::Camera::V1_0::NO_ERROR) { 255094332d3Sopenharmony_ci printf("GetStreamOperator fail, rc = %d\n", rc); 256094332d3Sopenharmony_ci CAMERA_LOGE("GetStreamOperator fail, rc = %{public}d", rc); 257094332d3Sopenharmony_ci return; 258094332d3Sopenharmony_ci } 259094332d3Sopenharmony_ci streamInfoPre = std::make_shared<StreamInfo>(); 260094332d3Sopenharmony_ci streamInfoVideo = std::make_shared<StreamInfo>(); 261094332d3Sopenharmony_ci streamInfoCapture = std::make_shared<StreamInfo>(); 262094332d3Sopenharmony_ci streamInfoAnalyze = std::make_shared<StreamInfo>(); 263094332d3Sopenharmony_ci for (auto& intent : intents) { 264094332d3Sopenharmony_ci if (intent == StreamIntent::PREVIEW) { 265094332d3Sopenharmony_ci DefaultInfosPreview(streamInfoPre); 266094332d3Sopenharmony_ci streamInfos.push_back(*streamInfoPre); 267094332d3Sopenharmony_ci } else if (intent == StreamIntent::VIDEO) { 268094332d3Sopenharmony_ci DefaultInfosVideo(streamInfoVideo); 269094332d3Sopenharmony_ci streamInfos.push_back(*streamInfoVideo); 270094332d3Sopenharmony_ci } else if (intent == StreamIntent::ANALYZE) { 271094332d3Sopenharmony_ci DefaultInfosAnalyze(streamInfoAnalyze); 272094332d3Sopenharmony_ci streamInfos.push_back(*streamInfoAnalyze); 273094332d3Sopenharmony_ci } else { 274094332d3Sopenharmony_ci DefaultInfosCapture(streamInfoCapture); 275094332d3Sopenharmony_ci streamInfos.push_back(*streamInfoCapture); 276094332d3Sopenharmony_ci } 277094332d3Sopenharmony_ci } 278094332d3Sopenharmony_ci 279094332d3Sopenharmony_ci rc = streamOperator->CreateStreams(streamInfos); 280094332d3Sopenharmony_ci if (rc != HDI::Camera::V1_0::NO_ERROR) { 281094332d3Sopenharmony_ci printf("check StartStream: CreateStreams fail, rc = %d\n", rc); 282094332d3Sopenharmony_ci CAMERA_LOGE("check StartStream: CreateStreams fail, rc = %{public}d", rc); 283094332d3Sopenharmony_ci } 284094332d3Sopenharmony_ci rc = streamOperator->CommitStreams(OperationMode::NORMAL, abilityVec); 285094332d3Sopenharmony_ci if (rc != HDI::Camera::V1_0::NO_ERROR) { 286094332d3Sopenharmony_ci printf("check StartStream: CommitStreams fail, rc = %d\n", rc); 287094332d3Sopenharmony_ci CAMERA_LOGE("check StartStream: CommitStreams fail, rc = %{public}d", rc); 288094332d3Sopenharmony_ci } 289094332d3Sopenharmony_ci sleep(1); 290094332d3Sopenharmony_ci std::vector<StreamInfo>().swap(streamInfos); 291094332d3Sopenharmony_ci} 292094332d3Sopenharmony_ci 293094332d3Sopenharmony_civoid HdiCommon::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming) 294094332d3Sopenharmony_ci{ 295094332d3Sopenharmony_ci captureInfo = std::make_shared<CaptureInfo>(); 296094332d3Sopenharmony_ci captureInfo->streamIds_ = {streamId}; 297094332d3Sopenharmony_ci captureInfo->captureSetting_ = abilityVec; 298094332d3Sopenharmony_ci captureInfo->enableShutterCallback_ = shutterCallback; 299094332d3Sopenharmony_ci rc = streamOperator->Capture(captureId, *captureInfo, isStreaming); 300094332d3Sopenharmony_ci if (rc != HDI::Camera::V1_0::NO_ERROR) { 301094332d3Sopenharmony_ci printf("check Capture: Capture fail, rc = %d\n", rc); 302094332d3Sopenharmony_ci CAMERA_LOGE("check Capture: Capture fail, rc = %{public}d", rc); 303094332d3Sopenharmony_ci } 304094332d3Sopenharmony_ci sleep(UT_SLEEP_TIME); 305094332d3Sopenharmony_ci} 306094332d3Sopenharmony_ci 307094332d3Sopenharmony_civoid HdiCommon::StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds) 308094332d3Sopenharmony_ci{ 309094332d3Sopenharmony_ci if (captureIds.size() > 0) { 310094332d3Sopenharmony_ci for (auto &captureId : captureIds) { 311094332d3Sopenharmony_ci rc = streamOperator->CancelCapture(captureId); 312094332d3Sopenharmony_ci if (rc != HDI::Camera::V1_0::NO_ERROR) { 313094332d3Sopenharmony_ci printf("check CancelCapture fail, rc = %d, captureId = %d\n", rc, captureId); 314094332d3Sopenharmony_ci CAMERA_LOGE("check CancelCapture fail, rc = %{public}d, captureId = %{public}d", rc, captureId); 315094332d3Sopenharmony_ci } 316094332d3Sopenharmony_ci } 317094332d3Sopenharmony_ci } 318094332d3Sopenharmony_ci if (streamIds.size() > 0) { 319094332d3Sopenharmony_ci rc = streamOperator->ReleaseStreams(streamIds); 320094332d3Sopenharmony_ci if (rc != HDI::Camera::V1_0::NO_ERROR) { 321094332d3Sopenharmony_ci printf("check Capture: ReleaseStreams fail, rc = %d\n", rc); 322094332d3Sopenharmony_ci CAMERA_LOGE("check Capture: ReleaseStreams fail, rc = %{public}d", rc); 323094332d3Sopenharmony_ci } 324094332d3Sopenharmony_ci } 325094332d3Sopenharmony_ci} 326094332d3Sopenharmony_ci 327094332d3Sopenharmony_civoid HdiCommon::StreamConsumer::CalculateFps(int64_t timestamp, int32_t streamId) 328094332d3Sopenharmony_ci{ 329094332d3Sopenharmony_ci if (isFirstCalculateFps_) { 330094332d3Sopenharmony_ci if ((timestamp - intervalTimestamp_) >= interval_) { 331094332d3Sopenharmony_ci int64_t timeInterval = timestamp - intervalTimestamp_; 332094332d3Sopenharmony_ci if (timeInterval != 0) { 333094332d3Sopenharmony_ci float fps = (int64_t)(100000000000 * timestampCount_ / timeInterval) / 100.0; 334094332d3Sopenharmony_ci CAMERA_LOGI("Calculate FPS success, streamId: %{public}d, Fps:%{public}f", streamId, fps); 335094332d3Sopenharmony_ci interval_ = ONESECOND_OF_MICROSECOND_UNIT; 336094332d3Sopenharmony_ci } else { 337094332d3Sopenharmony_ci CAMERA_LOGE("Calculate FPS error timeInerval is 0"); 338094332d3Sopenharmony_ci } 339094332d3Sopenharmony_ci } 340094332d3Sopenharmony_ci } else { 341094332d3Sopenharmony_ci intervalTimestamp_ = timestamp; 342094332d3Sopenharmony_ci isFirstCalculateFps_ = true; 343094332d3Sopenharmony_ci } 344094332d3Sopenharmony_ci if ((timestamp - intervalTimestamp_) >= ONESECOND_OF_MICROSECOND_UNIT * UT_SECOND_TIMES) { 345094332d3Sopenharmony_ci intervalTimestamp_ = timestamp; 346094332d3Sopenharmony_ci timestampCount_ = 0; 347094332d3Sopenharmony_ci interval_ = ONESECOND_OF_MICROSECOND_UNIT; 348094332d3Sopenharmony_ci } 349094332d3Sopenharmony_ci timestampCount_++; 350094332d3Sopenharmony_ci} 351094332d3Sopenharmony_ci 352094332d3Sopenharmony_ciOHOS::sptr<OHOS::IBufferProducer> HdiCommon::StreamConsumer::CreateProducer( 353094332d3Sopenharmony_ci std::function<void(void*, uint32_t)> callback) 354094332d3Sopenharmony_ci{ 355094332d3Sopenharmony_ci consumer_ = OHOS::IConsumerSurface::Create(); 356094332d3Sopenharmony_ci if (consumer_ == nullptr) { 357094332d3Sopenharmony_ci return nullptr; 358094332d3Sopenharmony_ci } 359094332d3Sopenharmony_ci sptr<IBufferConsumerListener> listener = new TestBufferConsumerListener(); 360094332d3Sopenharmony_ci consumer_->RegisterConsumerListener(listener); 361094332d3Sopenharmony_ci auto producer = consumer_->GetProducer(); 362094332d3Sopenharmony_ci if (producer == nullptr) { 363094332d3Sopenharmony_ci return nullptr; 364094332d3Sopenharmony_ci } 365094332d3Sopenharmony_ci 366094332d3Sopenharmony_ci callback_ = callback; 367094332d3Sopenharmony_ci consumerThread_ = new std::thread([this, listener] { 368094332d3Sopenharmony_ci int32_t flushFence = 0; 369094332d3Sopenharmony_ci int64_t timestamp = 0; 370094332d3Sopenharmony_ci OHOS::Rect damage; 371094332d3Sopenharmony_ci TestBufferConsumerListener* checker = static_cast<TestBufferConsumerListener*>(listener.GetRefPtr()); 372094332d3Sopenharmony_ci while (running_ == true) { 373094332d3Sopenharmony_ci OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr; 374094332d3Sopenharmony_ci if (checker->checkBufferAvailable()) { 375094332d3Sopenharmony_ci consumer_->AcquireBuffer(buffer, flushFence, timestamp, damage); 376094332d3Sopenharmony_ci if (buffer != nullptr) { 377094332d3Sopenharmony_ci void* addr = buffer->GetVirAddr(); 378094332d3Sopenharmony_ci uint32_t size = buffer->GetSize(); 379094332d3Sopenharmony_ci 380094332d3Sopenharmony_ci int32_t gotSize = 0; 381094332d3Sopenharmony_ci int32_t isKey = 0; 382094332d3Sopenharmony_ci int32_t streamId = 0; 383094332d3Sopenharmony_ci int32_t captureId = 0; 384094332d3Sopenharmony_ci buffer->GetExtraData()->ExtraGet(OHOS::Camera::dataSize, gotSize); 385094332d3Sopenharmony_ci buffer->GetExtraData()->ExtraGet(OHOS::Camera::isKeyFrame, isKey); 386094332d3Sopenharmony_ci buffer->GetExtraData()->ExtraGet(OHOS::Camera::timeStamp, timestamp); 387094332d3Sopenharmony_ci buffer->GetExtraData()->ExtraGet(OHOS::Camera::streamId, streamId); 388094332d3Sopenharmony_ci buffer->GetExtraData()->ExtraGet(OHOS::Camera::captureId, captureId); 389094332d3Sopenharmony_ci if (gotSize) { 390094332d3Sopenharmony_ci CalculateFps(timestamp, streamId); 391094332d3Sopenharmony_ci callback_(addr, gotSize); 392094332d3Sopenharmony_ci } else { 393094332d3Sopenharmony_ci callback_(addr, size); 394094332d3Sopenharmony_ci } 395094332d3Sopenharmony_ci 396094332d3Sopenharmony_ci consumer_->ReleaseBuffer(buffer, -1); 397094332d3Sopenharmony_ci shotCount_--; 398094332d3Sopenharmony_ci if (shotCount_ == 0) { 399094332d3Sopenharmony_ci std::unique_lock<std::mutex> l(l_); 400094332d3Sopenharmony_ci cv_.notify_one(); 401094332d3Sopenharmony_ci } 402094332d3Sopenharmony_ci } 403094332d3Sopenharmony_ci } 404094332d3Sopenharmony_ci if (running_ == false) { 405094332d3Sopenharmony_ci break; 406094332d3Sopenharmony_ci } 407094332d3Sopenharmony_ci usleep(1); 408094332d3Sopenharmony_ci } 409094332d3Sopenharmony_ci }); 410094332d3Sopenharmony_ci 411094332d3Sopenharmony_ci return producer; 412094332d3Sopenharmony_ci} 413094332d3Sopenharmony_ci 414094332d3Sopenharmony_ciOHOS::sptr<BufferProducerSequenceable> HdiCommon::StreamConsumer::CreateProducerSeq( 415094332d3Sopenharmony_ci std::function<void(void*, uint32_t)> callback) 416094332d3Sopenharmony_ci{ 417094332d3Sopenharmony_ci OHOS::sptr<OHOS::IBufferProducer> producer = CreateProducer(callback); 418094332d3Sopenharmony_ci if (producer == nullptr) { 419094332d3Sopenharmony_ci return nullptr; 420094332d3Sopenharmony_ci } 421094332d3Sopenharmony_ci 422094332d3Sopenharmony_ci return new BufferProducerSequenceable(producer); 423094332d3Sopenharmony_ci} 424094332d3Sopenharmony_ci 425094332d3Sopenharmony_ciint32_t HdiCommon::TestStreamOperatorCallback::OnCaptureStarted( 426094332d3Sopenharmony_ci int32_t captureId, const std::vector<int32_t> &streamId) 427094332d3Sopenharmony_ci{ 428094332d3Sopenharmony_ci for (auto it : streamId) { 429094332d3Sopenharmony_ci CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it); 430094332d3Sopenharmony_ci } 431094332d3Sopenharmony_ci return HDI::Camera::V1_0::NO_ERROR; 432094332d3Sopenharmony_ci} 433094332d3Sopenharmony_ci 434094332d3Sopenharmony_ciint32_t HdiCommon::TestStreamOperatorCallback::OnCaptureEnded( 435094332d3Sopenharmony_ci int32_t captureId, const std::vector<CaptureEndedInfo> &infos) 436094332d3Sopenharmony_ci{ 437094332d3Sopenharmony_ci for (auto it : infos) { 438094332d3Sopenharmony_ci CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_, 439094332d3Sopenharmony_ci it.frameCount_); 440094332d3Sopenharmony_ci } 441094332d3Sopenharmony_ci return HDI::Camera::V1_0::NO_ERROR; 442094332d3Sopenharmony_ci} 443094332d3Sopenharmony_ci 444094332d3Sopenharmony_ciint32_t HdiCommon::TestStreamOperatorCallback::OnCaptureError( 445094332d3Sopenharmony_ci int32_t captureId, const std::vector<CaptureErrorInfo> &infos) 446094332d3Sopenharmony_ci{ 447094332d3Sopenharmony_ci for (auto it : infos) { 448094332d3Sopenharmony_ci CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_, 449094332d3Sopenharmony_ci it.error_); 450094332d3Sopenharmony_ci } 451094332d3Sopenharmony_ci return HDI::Camera::V1_0::NO_ERROR; 452094332d3Sopenharmony_ci} 453094332d3Sopenharmony_ci 454094332d3Sopenharmony_ciint32_t HdiCommon::TestStreamOperatorCallback::OnFrameShutter(int32_t captureId, 455094332d3Sopenharmony_ci const std::vector<int32_t> &streamIds, uint64_t timestamp) 456094332d3Sopenharmony_ci{ 457094332d3Sopenharmony_ci (void)timestamp; 458094332d3Sopenharmony_ci for (auto it : streamIds) { 459094332d3Sopenharmony_ci CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it); 460094332d3Sopenharmony_ci } 461094332d3Sopenharmony_ci return HDI::Camera::V1_0::NO_ERROR; 462094332d3Sopenharmony_ci} 463094332d3Sopenharmony_ci 464094332d3Sopenharmony_ciint32_t HdiCommon::DemoCameraDeviceCallback::OnError(ErrorType type, int32_t errorMsg) 465094332d3Sopenharmony_ci{ 466094332d3Sopenharmony_ci CAMERA_LOGE("type: %{public}d, errorMsg: %{public}d", type, errorMsg); 467094332d3Sopenharmony_ci return HDI::Camera::V1_0::NO_ERROR; 468094332d3Sopenharmony_ci} 469094332d3Sopenharmony_ci 470094332d3Sopenharmony_ciint32_t HdiCommon::DemoCameraDeviceCallback::OnResult(uint64_t timestamp, const std::vector<uint8_t> &result) 471094332d3Sopenharmony_ci{ 472094332d3Sopenharmony_ci if (HdiCommon::resultCallback_) { 473094332d3Sopenharmony_ci std::shared_ptr<CameraMetadata> resultMeta; 474094332d3Sopenharmony_ci MetadataUtils::ConvertVecToMetadata(result, resultMeta); 475094332d3Sopenharmony_ci HdiCommon::resultCallback_(timestamp, resultMeta); 476094332d3Sopenharmony_ci } 477094332d3Sopenharmony_ci return HDI::Camera::V1_0::NO_ERROR; 478094332d3Sopenharmony_ci} 479094332d3Sopenharmony_ci 480094332d3Sopenharmony_ciint32_t HdiCommon::TestCameraHostCallback::OnCameraStatus(const std::string& cameraId, CameraStatus status) 481094332d3Sopenharmony_ci{ 482094332d3Sopenharmony_ci CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status); 483094332d3Sopenharmony_ci return HDI::Camera::V1_0::NO_ERROR; 484094332d3Sopenharmony_ci} 485094332d3Sopenharmony_ci 486094332d3Sopenharmony_ciint32_t HdiCommon::TestCameraHostCallback::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status) 487094332d3Sopenharmony_ci{ 488094332d3Sopenharmony_ci CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status); 489094332d3Sopenharmony_ci return HDI::Camera::V1_0::NO_ERROR; 490094332d3Sopenharmony_ci} 491094332d3Sopenharmony_ci 492094332d3Sopenharmony_ciint32_t HdiCommon::TestCameraHostCallback::OnCameraEvent(const std::string& cameraId, CameraEvent event) 493094332d3Sopenharmony_ci{ 494094332d3Sopenharmony_ci CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), event); 495094332d3Sopenharmony_ci return HDI::Camera::V1_0::NO_ERROR; 496094332d3Sopenharmony_ci} 497094332d3Sopenharmony_ci 498094332d3Sopenharmony_ci} 499