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