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 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 "camera_dump.h" 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_ci#include <sys/time.h> 19094332d3Sopenharmony_ci#include <fstream> 20094332d3Sopenharmony_ci#include <sstream> 21094332d3Sopenharmony_ci#include <cstdio> 22094332d3Sopenharmony_ci#include <iostream> 23094332d3Sopenharmony_ci#include <cstdlib> 24094332d3Sopenharmony_ci#include <regex> 25094332d3Sopenharmony_ci 26094332d3Sopenharmony_ci#include "camera.h" 27094332d3Sopenharmony_ci#include "v1_0/vdi_types.h" 28094332d3Sopenharmony_ci 29094332d3Sopenharmony_ciusing namespace std; 30094332d3Sopenharmony_ci 31094332d3Sopenharmony_cinamespace OHOS::Camera { 32094332d3Sopenharmony_ciconst std::string DUMP_PATH = "/data/local/tmp/"; 33094332d3Sopenharmony_ciconst std::string DUMP_CONFIG_PATH = "/data/local/tmp/dump.config"; 34094332d3Sopenharmony_ciconstexpr uint32_t ARGS_MAX_NUM = 5; 35094332d3Sopenharmony_ciconstexpr uint32_t MAX_USAGE_RATE = 70; 36094332d3Sopenharmony_ciconstexpr int32_t CHECK_DISKINFO_TIME_MS = 10000; 37094332d3Sopenharmony_ciconst uint32_t TITLEINFO_ARRAY_SIZE = 200; 38094332d3Sopenharmony_ci 39094332d3Sopenharmony_ciconst char *g_cameraDumpHelp = 40094332d3Sopenharmony_ci " Camera manager dump options:\n" 41094332d3Sopenharmony_ci " -h: camera dump help\n" 42094332d3Sopenharmony_ci " -m: start dump metadata\n" 43094332d3Sopenharmony_ci " -b: start dump buffer\n" 44094332d3Sopenharmony_ci " -o: start dump start\n" 45094332d3Sopenharmony_ci " -e: exit all dump\n"; 46094332d3Sopenharmony_ci 47094332d3Sopenharmony_cistd::map<DumpType, bool> g_dumpInfoMap = { 48094332d3Sopenharmony_ci {MedataType, false}, 49094332d3Sopenharmony_ci {BufferType, false}, 50094332d3Sopenharmony_ci {OpenType, false} 51094332d3Sopenharmony_ci}; 52094332d3Sopenharmony_ci 53094332d3Sopenharmony_cistd::map<std::string, std::string> g_dumpToolMap = { 54094332d3Sopenharmony_ci {ENABLE_DQ_BUFFER_DUMP, "false"}, 55094332d3Sopenharmony_ci {ENABLE_UVC_NODE, "false"}, 56094332d3Sopenharmony_ci {ENABLE_UVC_NODE_CONVERTED, "false"}, 57094332d3Sopenharmony_ci {ENABLE_EXIF_NODE_CONVERTED, "false"}, 58094332d3Sopenharmony_ci {ENABLE_FACE_NODE_CONVERTED, "false"}, 59094332d3Sopenharmony_ci {ENABLE_FORK_NODE_CONVERTED, "false"}, 60094332d3Sopenharmony_ci {ENABLE_RKFACE_NODE_CONVERTED, "false"}, 61094332d3Sopenharmony_ci {ENABLE_RKEXIF_NODE_CONVERTED, "false"}, 62094332d3Sopenharmony_ci {ENABLE_CODEC_NODE_CONVERTED, "false"}, 63094332d3Sopenharmony_ci {ENABLE_RKCODEC_NODE_CONVERTED, "false"}, 64094332d3Sopenharmony_ci {ENABLE_STREAM_TUNNEL, "false"}, 65094332d3Sopenharmony_ci {ENABLE_METADATA, "false"}, 66094332d3Sopenharmony_ci {PREVIEW_INTERVAL, "1"}, 67094332d3Sopenharmony_ci {CAPTURE_INTERVAL, "1"} 68094332d3Sopenharmony_ci}; 69094332d3Sopenharmony_ci 70094332d3Sopenharmony_ciCameraDumper::~CameraDumper() 71094332d3Sopenharmony_ci{ 72094332d3Sopenharmony_ci StopCheckDiskInfo(); 73094332d3Sopenharmony_ci} 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_cibool CameraDumper::DumpStart() 76094332d3Sopenharmony_ci{ 77094332d3Sopenharmony_ci if (!IsDumpOpened(OpenType)) { 78094332d3Sopenharmony_ci return false; 79094332d3Sopenharmony_ci } 80094332d3Sopenharmony_ci std::stringstream mkdirCmd; 81094332d3Sopenharmony_ci mkdirCmd << "mkdir -p " << DUMP_PATH; 82094332d3Sopenharmony_ci system(mkdirCmd.str().c_str()); 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_ci ReadDumpConfig(); 85094332d3Sopenharmony_ci return true; 86094332d3Sopenharmony_ci} 87094332d3Sopenharmony_ci 88094332d3Sopenharmony_cibool CameraDumper::ReadDumpConfig() 89094332d3Sopenharmony_ci{ 90094332d3Sopenharmony_ci std::stringstream ss; 91094332d3Sopenharmony_ci ss << DUMP_CONFIG_PATH; 92094332d3Sopenharmony_ci std::ifstream ifs; 93094332d3Sopenharmony_ci ifs.open(ss.str(), std::ios::in); 94094332d3Sopenharmony_ci if (!ifs) { 95094332d3Sopenharmony_ci CAMERA_LOGE("open dump config file <%{public}s> failed, error: %{public}s", 96094332d3Sopenharmony_ci ss.str().c_str(), std::strerror(errno)); 97094332d3Sopenharmony_ci return false; 98094332d3Sopenharmony_ci } 99094332d3Sopenharmony_ci 100094332d3Sopenharmony_ci std::string str; 101094332d3Sopenharmony_ci while (!ifs.eof()) { 102094332d3Sopenharmony_ci if (ifs >> str) { 103094332d3Sopenharmony_ci istringstream istr(str); 104094332d3Sopenharmony_ci std::string strTemp; 105094332d3Sopenharmony_ci vector<std::string> strVector; 106094332d3Sopenharmony_ci while (getline(istr, strTemp, '=')) { 107094332d3Sopenharmony_ci strVector.push_back(strTemp); 108094332d3Sopenharmony_ci } 109094332d3Sopenharmony_ci g_dumpToolMap[strVector[0]] = strVector[1]; 110094332d3Sopenharmony_ci } 111094332d3Sopenharmony_ci } 112094332d3Sopenharmony_ci 113094332d3Sopenharmony_ci ifs.close(); 114094332d3Sopenharmony_ci return true; 115094332d3Sopenharmony_ci} 116094332d3Sopenharmony_ci 117094332d3Sopenharmony_cibool CameraDumper::IsDumpCommandOpened(std::string type) 118094332d3Sopenharmony_ci{ 119094332d3Sopenharmony_ci std::lock_guard<std::mutex> l(dumpStateLock_); 120094332d3Sopenharmony_ci if (g_dumpToolMap.find(type) != g_dumpToolMap.end() && g_dumpToolMap[type] == "true") { 121094332d3Sopenharmony_ci return true; 122094332d3Sopenharmony_ci } 123094332d3Sopenharmony_ci return false; 124094332d3Sopenharmony_ci} 125094332d3Sopenharmony_ci 126094332d3Sopenharmony_cibool CameraDumper::DumpBuffer(std::string name, std::string type, const std::shared_ptr<IBuffer>& buffer, 127094332d3Sopenharmony_ci uint32_t width, uint32_t height) 128094332d3Sopenharmony_ci{ 129094332d3Sopenharmony_ci if (!IsDumpOpened(OpenType) || !IsDumpCommandOpened(type) || (buffer == nullptr)) { 130094332d3Sopenharmony_ci return false; 131094332d3Sopenharmony_ci } 132094332d3Sopenharmony_ci uint32_t defaultWidth = (width == 0) ? buffer->GetCurWidth() : width; 133094332d3Sopenharmony_ci uint32_t defaultHeight = (height == 0) ? buffer->GetCurHeight() : height; 134094332d3Sopenharmony_ci void* srcAddr = buffer->GetIsValidDataInSurfaceBuffer() ? buffer->GetSuffaceBufferAddr() : buffer->GetVirAddress(); 135094332d3Sopenharmony_ci uint32_t size = buffer->GetIsValidDataInSurfaceBuffer() ? buffer->GetSuffaceBufferSize() : buffer->GetSize(); 136094332d3Sopenharmony_ci const std::string DqBufferName = "DQBuffer"; 137094332d3Sopenharmony_ci if (name != DqBufferName) { 138094332d3Sopenharmony_ci size = buffer->GetEsFrameInfo().size > 0 ? buffer->GetEsFrameInfo().size : size; 139094332d3Sopenharmony_ci } 140094332d3Sopenharmony_ci 141094332d3Sopenharmony_ci std::stringstream ss; 142094332d3Sopenharmony_ci std::string fileName; 143094332d3Sopenharmony_ci ss << name.c_str() << "_captureId[" << buffer->GetCaptureId() << "]_streamId[" << buffer->GetStreamId() << 144094332d3Sopenharmony_ci "]_width[" << defaultWidth << "]_height[" << defaultHeight; 145094332d3Sopenharmony_ci 146094332d3Sopenharmony_ci int32_t previewInterval = 1; 147094332d3Sopenharmony_ci std::istringstream ssPreview(g_dumpToolMap[PREVIEW_INTERVAL]); 148094332d3Sopenharmony_ci ssPreview >> previewInterval; 149094332d3Sopenharmony_ci 150094332d3Sopenharmony_ci int32_t captureInterval = 1; 151094332d3Sopenharmony_ci std::istringstream ssVideo(g_dumpToolMap[CAPTURE_INTERVAL]); 152094332d3Sopenharmony_ci ssVideo >> captureInterval; 153094332d3Sopenharmony_ci 154094332d3Sopenharmony_ci ++dumpCount_; 155094332d3Sopenharmony_ci if (buffer->GetEncodeType() == VDI::Camera::V1_0::ENCODE_TYPE_JPEG) { 156094332d3Sopenharmony_ci if (dumpCount_ % captureInterval != 0) { 157094332d3Sopenharmony_ci return true; 158094332d3Sopenharmony_ci } 159094332d3Sopenharmony_ci ss << "]_" << GetCurrentLocalTimeStamp(); 160094332d3Sopenharmony_ci ss >> fileName; 161094332d3Sopenharmony_ci fileName += ".jpeg"; 162094332d3Sopenharmony_ci } else if (buffer->GetEncodeType() == VDI::Camera::V1_0::ENCODE_TYPE_H264) { 163094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_USB 164094332d3Sopenharmony_ci ss << "]_" << GetCurrentLocalTimeStamp(); 165094332d3Sopenharmony_ci ss >> fileName; 166094332d3Sopenharmony_ci fileName += "_umpVideo.yuv"; 167094332d3Sopenharmony_ci#else 168094332d3Sopenharmony_ci fileName += "dumpVideo.h264"; 169094332d3Sopenharmony_ci#endif 170094332d3Sopenharmony_ci } else { 171094332d3Sopenharmony_ci if (dumpCount_ % previewInterval != 0) { 172094332d3Sopenharmony_ci return true; 173094332d3Sopenharmony_ci } 174094332d3Sopenharmony_ci 175094332d3Sopenharmony_ci ss << "]_" << GetCurrentLocalTimeStamp(); 176094332d3Sopenharmony_ci ss >> fileName; 177094332d3Sopenharmony_ci fileName += ".yuv"; 178094332d3Sopenharmony_ci } 179094332d3Sopenharmony_ci return SaveDataToFile(fileName.c_str(), srcAddr, size); 180094332d3Sopenharmony_ci} 181094332d3Sopenharmony_ci 182094332d3Sopenharmony_cibool CameraDumper::DumpMetadata(std::string name, std::string type, 183094332d3Sopenharmony_ci const std::shared_ptr<CameraMetadata>& metadata) 184094332d3Sopenharmony_ci{ 185094332d3Sopenharmony_ci if (metadata == nullptr) { 186094332d3Sopenharmony_ci CAMERA_LOGE("metadata is nullptr"); 187094332d3Sopenharmony_ci return false; 188094332d3Sopenharmony_ci } 189094332d3Sopenharmony_ci 190094332d3Sopenharmony_ci if (!IsDumpOpened(OpenType) || !IsDumpCommandOpened(type)) { 191094332d3Sopenharmony_ci return false; 192094332d3Sopenharmony_ci } 193094332d3Sopenharmony_ci 194094332d3Sopenharmony_ci common_metadata_header_t *data = metadata->get(); 195094332d3Sopenharmony_ci if (data == nullptr) { 196094332d3Sopenharmony_ci CAMERA_LOGE("data is nullptr"); 197094332d3Sopenharmony_ci return false; 198094332d3Sopenharmony_ci } 199094332d3Sopenharmony_ci std::string metaStr = FormatCameraMetadataToString(data); 200094332d3Sopenharmony_ci if (metaStr.size() == 0) { 201094332d3Sopenharmony_ci CAMERA_LOGE("metaStr.size is 0"); 202094332d3Sopenharmony_ci return true; 203094332d3Sopenharmony_ci } 204094332d3Sopenharmony_ci std::stringstream ss; 205094332d3Sopenharmony_ci ss << GetCurrentLocalTimeStamp() << "_" << name << ".meta"; 206094332d3Sopenharmony_ci 207094332d3Sopenharmony_ci return SaveDataToFile(ss.str().c_str(), metaStr.c_str(), metaStr.size()); 208094332d3Sopenharmony_ci} 209094332d3Sopenharmony_ci 210094332d3Sopenharmony_civoid CameraDumper::UpdateDumpMode(DumpType type, bool isDump, HdfSBuf *reply) 211094332d3Sopenharmony_ci{ 212094332d3Sopenharmony_ci std::string upRetStr; 213094332d3Sopenharmony_ci { 214094332d3Sopenharmony_ci std::lock_guard<std::mutex> l(dumpStateLock_); 215094332d3Sopenharmony_ci auto it = g_dumpInfoMap.find(type); 216094332d3Sopenharmony_ci if (it != g_dumpInfoMap.end()) { 217094332d3Sopenharmony_ci g_dumpInfoMap[type] = isDump; 218094332d3Sopenharmony_ci upRetStr += " set dump mode success!\n"; 219094332d3Sopenharmony_ci } 220094332d3Sopenharmony_ci } 221094332d3Sopenharmony_ci 222094332d3Sopenharmony_ci if (reply != nullptr) { 223094332d3Sopenharmony_ci (void)HdfSbufWriteString(reply, upRetStr.c_str()); 224094332d3Sopenharmony_ci } 225094332d3Sopenharmony_ci 226094332d3Sopenharmony_ci if (isDump) { 227094332d3Sopenharmony_ci StartCheckDiskInfo(); 228094332d3Sopenharmony_ci } else { 229094332d3Sopenharmony_ci StopCheckDiskInfo(); 230094332d3Sopenharmony_ci } 231094332d3Sopenharmony_ci} 232094332d3Sopenharmony_ci 233094332d3Sopenharmony_cibool CameraDumper::IsDumpOpened(DumpType type) 234094332d3Sopenharmony_ci{ 235094332d3Sopenharmony_ci std::lock_guard<std::mutex> l(dumpStateLock_); 236094332d3Sopenharmony_ci if (g_dumpInfoMap.find(type) != g_dumpInfoMap.end() && g_dumpInfoMap[type]) { 237094332d3Sopenharmony_ci return true; 238094332d3Sopenharmony_ci } 239094332d3Sopenharmony_ci return false; 240094332d3Sopenharmony_ci} 241094332d3Sopenharmony_ci 242094332d3Sopenharmony_cibool CameraDumper::SaveDataToFile(const char *fileName, const void *data, uint32_t size) 243094332d3Sopenharmony_ci{ 244094332d3Sopenharmony_ci CAMERA_LOGI("save dump file <%{public}s> begin, size: %{public}d", fileName, size); 245094332d3Sopenharmony_ci std::stringstream mkdirCmd; 246094332d3Sopenharmony_ci mkdirCmd << "mkdir -p " << DUMP_PATH; 247094332d3Sopenharmony_ci system(mkdirCmd.str().c_str()); 248094332d3Sopenharmony_ci 249094332d3Sopenharmony_ci std::stringstream ss; 250094332d3Sopenharmony_ci ss << DUMP_PATH << fileName; 251094332d3Sopenharmony_ci std::ofstream ofs(ss.str(), std::ios::app); 252094332d3Sopenharmony_ci 253094332d3Sopenharmony_ci if (!ofs.good()) { 254094332d3Sopenharmony_ci CAMERA_LOGE("open dump file <%{public}s> failed, error: %{public}s", ss.str().c_str(), std::strerror(errno)); 255094332d3Sopenharmony_ci return false; 256094332d3Sopenharmony_ci } 257094332d3Sopenharmony_ci 258094332d3Sopenharmony_ci ofs.write(static_cast<const char *>(data), size); 259094332d3Sopenharmony_ci ofs.close(); 260094332d3Sopenharmony_ci 261094332d3Sopenharmony_ci return true; 262094332d3Sopenharmony_ci} 263094332d3Sopenharmony_ci 264094332d3Sopenharmony_ciuint64_t CameraDumper::GetCurrentLocalTimeStamp() 265094332d3Sopenharmony_ci{ 266094332d3Sopenharmony_ci std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = 267094332d3Sopenharmony_ci std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); 268094332d3Sopenharmony_ci auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()); 269094332d3Sopenharmony_ci return static_cast<uint64_t>(tmp.count()); 270094332d3Sopenharmony_ci} 271094332d3Sopenharmony_ci 272094332d3Sopenharmony_civoid CameraDumper::ShowDumpMenu(HdfSBuf *reply) 273094332d3Sopenharmony_ci{ 274094332d3Sopenharmony_ci if (reply != nullptr) { 275094332d3Sopenharmony_ci (void)HdfSbufWriteString(reply, g_cameraDumpHelp); 276094332d3Sopenharmony_ci } 277094332d3Sopenharmony_ci} 278094332d3Sopenharmony_ci 279094332d3Sopenharmony_civoid CameraDumper::CameraHostDumpProcess(HdfSBuf *data, HdfSBuf *reply) 280094332d3Sopenharmony_ci{ 281094332d3Sopenharmony_ci if (data == nullptr || reply == nullptr) { 282094332d3Sopenharmony_ci CAMERA_LOGE("%{public}s is nullptr", (data == nullptr) ? "data" : "reply"); 283094332d3Sopenharmony_ci return; 284094332d3Sopenharmony_ci } 285094332d3Sopenharmony_ci 286094332d3Sopenharmony_ci uint32_t argsNum; 287094332d3Sopenharmony_ci if (!HdfSbufReadUint32(data, &argsNum)) { 288094332d3Sopenharmony_ci CAMERA_LOGE("read argsNum failed!"); 289094332d3Sopenharmony_ci return; 290094332d3Sopenharmony_ci } 291094332d3Sopenharmony_ci 292094332d3Sopenharmony_ci if (argsNum <= 0 || argsNum > ARGS_MAX_NUM) { 293094332d3Sopenharmony_ci (void)HdfSbufWriteString(reply, g_cameraDumpHelp); 294094332d3Sopenharmony_ci return; 295094332d3Sopenharmony_ci } 296094332d3Sopenharmony_ci 297094332d3Sopenharmony_ci for (uint32_t i = 0; i < argsNum; i++) { 298094332d3Sopenharmony_ci const char *value = HdfSbufReadString(data); 299094332d3Sopenharmony_ci if (value == NULL) { 300094332d3Sopenharmony_ci CAMERA_LOGE("arg is invalid i: %{public}u", i); 301094332d3Sopenharmony_ci return; 302094332d3Sopenharmony_ci } 303094332d3Sopenharmony_ci if (strcmp(value, "-m") == 0) { 304094332d3Sopenharmony_ci UpdateDumpMode(MedataType, true, reply); 305094332d3Sopenharmony_ci } else if (strcmp(value, "-b") == 0) { 306094332d3Sopenharmony_ci UpdateDumpMode(BufferType, true, reply); 307094332d3Sopenharmony_ci } else if (strcmp(value, "-e") == 0) { 308094332d3Sopenharmony_ci UpdateDumpMode(BufferType, false, reply); 309094332d3Sopenharmony_ci UpdateDumpMode(MedataType, false, reply); 310094332d3Sopenharmony_ci } else if (strcmp(value, "-o") == 0) { 311094332d3Sopenharmony_ci UpdateDumpMode(OpenType, true, reply); 312094332d3Sopenharmony_ci } else { 313094332d3Sopenharmony_ci ShowDumpMenu(reply); 314094332d3Sopenharmony_ci } 315094332d3Sopenharmony_ci } 316094332d3Sopenharmony_ci} 317094332d3Sopenharmony_ci 318094332d3Sopenharmony_ciint32_t CameraDumpEvent(HdfSBuf *data, HdfSBuf *reply) 319094332d3Sopenharmony_ci{ 320094332d3Sopenharmony_ci CameraDumper& dumper = CameraDumper::GetInstance(); 321094332d3Sopenharmony_ci dumper.CameraHostDumpProcess(data, reply); 322094332d3Sopenharmony_ci return HDF_SUCCESS; 323094332d3Sopenharmony_ci} 324094332d3Sopenharmony_ci 325094332d3Sopenharmony_civoid CameraDumper::CheckDiskInfo() 326094332d3Sopenharmony_ci{ 327094332d3Sopenharmony_ci stringstream ss; 328094332d3Sopenharmony_ci ss << "df " << DUMP_PATH; 329094332d3Sopenharmony_ci 330094332d3Sopenharmony_ci FILE *fp = popen(ss.str().c_str(), "r"); 331094332d3Sopenharmony_ci if (fp == NULL) { 332094332d3Sopenharmony_ci CAMERA_LOGE("popen failed, cmd : %{public}s", ss.str().c_str()); 333094332d3Sopenharmony_ci return; 334094332d3Sopenharmony_ci } 335094332d3Sopenharmony_ci 336094332d3Sopenharmony_ci char titleInfo[TITLEINFO_ARRAY_SIZE] = {0}; 337094332d3Sopenharmony_ci char resultInfo[TITLEINFO_ARRAY_SIZE] = {0}; 338094332d3Sopenharmony_ci fgets(titleInfo, sizeof(titleInfo) / sizeof(titleInfo[0]) - 1, fp); 339094332d3Sopenharmony_ci fgets(resultInfo, sizeof(resultInfo) / sizeof(resultInfo[0]) - 1, fp); 340094332d3Sopenharmony_ci 341094332d3Sopenharmony_ci pclose(fp); 342094332d3Sopenharmony_ci 343094332d3Sopenharmony_ci std::string diskInfoStr(resultInfo); 344094332d3Sopenharmony_ci istringstream str(diskInfoStr); 345094332d3Sopenharmony_ci string out; 346094332d3Sopenharmony_ci std::vector<std::string> infos; 347094332d3Sopenharmony_ci 348094332d3Sopenharmony_ci while (str >> out) { 349094332d3Sopenharmony_ci infos.push_back(out); 350094332d3Sopenharmony_ci } 351094332d3Sopenharmony_ci 352094332d3Sopenharmony_ci std::string userPerStr = infos[4].substr(0, infos[4].length() - 1); 353094332d3Sopenharmony_ci uint32_t usePer = std::atoi(userPerStr.c_str()); 354094332d3Sopenharmony_ci if (usePer >= MAX_USAGE_RATE) { 355094332d3Sopenharmony_ci CAMERA_LOGE("dump use disk over the limit, stop dump"); 356094332d3Sopenharmony_ci std::lock_guard<std::mutex> l(dumpStateLock_); 357094332d3Sopenharmony_ci for (auto it = g_dumpInfoMap.begin(); it != g_dumpInfoMap.end(); it++) { 358094332d3Sopenharmony_ci it->second = false; 359094332d3Sopenharmony_ci } 360094332d3Sopenharmony_ci } 361094332d3Sopenharmony_ci} 362094332d3Sopenharmony_ci 363094332d3Sopenharmony_civoid CameraDumper::ThreadWorkFun() 364094332d3Sopenharmony_ci{ 365094332d3Sopenharmony_ci while (true) { 366094332d3Sopenharmony_ci CheckDiskInfo(); 367094332d3Sopenharmony_ci 368094332d3Sopenharmony_ci std::unique_lock<std::mutex> l(terminateLock_); 369094332d3Sopenharmony_ci cv_.wait_for(l, std::chrono::milliseconds(CHECK_DISKINFO_TIME_MS), 370094332d3Sopenharmony_ci [this]() { 371094332d3Sopenharmony_ci return terminate_; 372094332d3Sopenharmony_ci } 373094332d3Sopenharmony_ci ); 374094332d3Sopenharmony_ci 375094332d3Sopenharmony_ci if (terminate_) { 376094332d3Sopenharmony_ci break; 377094332d3Sopenharmony_ci } 378094332d3Sopenharmony_ci } 379094332d3Sopenharmony_ci} 380094332d3Sopenharmony_ci 381094332d3Sopenharmony_civoid CameraDumper::StartCheckDiskInfo() 382094332d3Sopenharmony_ci{ 383094332d3Sopenharmony_ci { 384094332d3Sopenharmony_ci std::unique_lock<std::mutex> l(terminateLock_); 385094332d3Sopenharmony_ci if (terminate_ == false) { 386094332d3Sopenharmony_ci CAMERA_LOGD("thread is already start"); 387094332d3Sopenharmony_ci return; 388094332d3Sopenharmony_ci } 389094332d3Sopenharmony_ci terminate_ = false; 390094332d3Sopenharmony_ci } 391094332d3Sopenharmony_ci 392094332d3Sopenharmony_ci handleThread_ = std::make_unique<std::thread>([this] { this->ThreadWorkFun(); }); 393094332d3Sopenharmony_ci} 394094332d3Sopenharmony_ci 395094332d3Sopenharmony_civoid CameraDumper::StopCheckDiskInfo() 396094332d3Sopenharmony_ci{ 397094332d3Sopenharmony_ci { 398094332d3Sopenharmony_ci std::unique_lock<std::mutex> l(terminateLock_); 399094332d3Sopenharmony_ci if (terminate_ == true) { 400094332d3Sopenharmony_ci CAMERA_LOGD("thread is already stop"); 401094332d3Sopenharmony_ci return; 402094332d3Sopenharmony_ci } 403094332d3Sopenharmony_ci terminate_ = true; 404094332d3Sopenharmony_ci cv_.notify_one(); 405094332d3Sopenharmony_ci } 406094332d3Sopenharmony_ci if (handleThread_ != nullptr && handleThread_->joinable()) { 407094332d3Sopenharmony_ci handleThread_->join(); 408094332d3Sopenharmony_ci handleThread_ = nullptr; 409094332d3Sopenharmony_ci } 410094332d3Sopenharmony_ci} 411094332d3Sopenharmony_ci 412094332d3Sopenharmony_ciCameraDumper& CameraDumper::GetInstance() 413094332d3Sopenharmony_ci{ 414094332d3Sopenharmony_ci static CameraDumper instance_; 415094332d3Sopenharmony_ci return instance_; 416094332d3Sopenharmony_ci} 417094332d3Sopenharmony_ci} // namespace OHOS::Camera 418