RtpFilesCleaner.cpp 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <tchar.h>
  3. #include <Shlwapi.h>
  4. #include "AnyCleaner.h"
  5. #include "RtpFilesCleaner.h"
  6. #include "CRtpFrame.h"
  7. #include "json.h"
  8. #include "RtpFast.h"
  9. #define _DEBUG1 0
  10. //#include "CRtpFrame.h"
  11. void rtpcallback_timeinfo(char* frame_data, int frame_size, \
  12. unsigned int frame_timesec, unsigned int frame_timeusec, bool is_iframe, \
  13. void* user_data)
  14. {
  15. if (frame_size < 0) return; // ignore error information
  16. RTPFILEDESC* rtp_filedesc = static_cast<RTPFILEDESC*>(user_data);
  17. if (!frame_data && !frame_size) { // end of file
  18. int diff_sec = 0;
  19. int diff_usec = 0;
  20. CTimeHelper::TimeDiff(&diff_sec, &diff_usec, rtp_filedesc->start_timesec, rtp_filedesc->start_timeusec, rtp_filedesc->end_timesec, rtp_filedesc->end_timeusec);
  21. rtp_filedesc->duration_sec = diff_sec;
  22. return;
  23. }
  24. if (!rtp_filedesc->start_timesec) {
  25. rtp_filedesc->start_timesec = frame_timesec;
  26. rtp_filedesc->start_timeusec = frame_timeusec;
  27. }
  28. rtp_filedesc->end_timesec = frame_timesec;
  29. rtp_filedesc->end_timeusec = frame_timeusec;
  30. }
  31. int rtp_proc(RTPFILEDESC* rtp_filedesc, Buffer_t* mem_buffer, CRtpFrame* rtp_frame, FRAMEDATACALLBACK framedata_cb, void* user_data)
  32. {
  33. if (rtp_filedesc->start_timesec != 0) {
  34. return 0;
  35. }
  36. if (!rtp_filedesc->file_size) {
  37. BLOG_ERROR(fmt::format("[F] {} file size is 0", rtp_filedesc->file_name));
  38. //CONSOLELOG(ERROR) << "[" << rtp_filedesc->file_name << "] file size is 0.";
  39. return -1;
  40. }
  41. if (mem_buffer->BufSize < rtp_filedesc->file_size) {
  42. BLOG_ERROR(fmt::format("[F] {} file size: {} is greater than allocated buffer size: {}", rtp_filedesc->file_name, rtp_filedesc->file_size, mem_buffer->BufSize));
  43. //CONSOLELOG(ERROR) << "[" << rtp_filedesc->file_name << "] file size: " << rtp_filedesc->file_size << " is greater than allocated buffer size: " << mem_buffer->BufSize;
  44. return -1;
  45. }
  46. FILE* fp = NULL;
  47. fp = fopen(rtp_filedesc->file_name, "rb");
  48. if (!fp) {
  49. BLOG_ERROR(fmt::format("[F] {} cannot open file.", rtp_filedesc->file_name));
  50. //CONSOLELOG(ERROR) << "[" << rtp_filedesc->file_name << "] cannot open file.";
  51. return -1;
  52. }
  53. // read in data
  54. fread(mem_buffer->pData, 1, rtp_filedesc->file_size, fp);
  55. fclose(fp);
  56. fp = NULL;
  57. char* file_data = mem_buffer->pData;
  58. char* frame_cache = mem_buffer->pData + mem_buffer->BufSize;
  59. unsigned int frame_cachesize = 0;
  60. int fatal_error = 0; // -1: parse header error, -2: file not completed
  61. char RtpHeader[64];
  62. const int HeaderSize = RTP_HEADER_SIZE + RTP_DATAINFO_EXT_SIZE;
  63. unsigned int M;
  64. unsigned int TimeStamp;
  65. unsigned int RtpDataSize;
  66. unsigned int RtpDataSec;
  67. unsigned int RtpDataUSec;
  68. unsigned int is_iframe;
  69. int data_size = 0;
  70. char* packet_databuffer = 0;
  71. while (data_size + HeaderSize < rtp_filedesc->file_size) { // assume at least one header is remain
  72. packet_databuffer = file_data;
  73. memcpy(RtpHeader, file_data, HeaderSize);
  74. file_data += HeaderSize;
  75. data_size += HeaderSize;
  76. M = 0;
  77. TimeStamp = 0;
  78. RtpDataSize = 0;
  79. is_iframe = 0;
  80. RtpDataSec = 0;
  81. RtpDataUSec = 0;
  82. if (RtpGetPacketSizeEx(&M, &TimeStamp, &RtpDataSize, &is_iframe, &RtpDataSec, &RtpDataUSec, NULL, NULL, RtpHeader) < 0) {
  83. fatal_error = -1; // corrupt rtp data
  84. break;
  85. }
  86. data_size += RtpDataSize;
  87. if (data_size > rtp_filedesc->file_size) { // the file is not completed
  88. fatal_error = -2;
  89. break;
  90. }
  91. // copy frame data
  92. if (frame_cachesize + RtpDataSize > FRAME_CACHESIZE) {
  93. BLOG_ERROR(fmt::format("[F] {} frame data size: {} is too large to be cached", rtp_filedesc->file_name, frame_cachesize + RtpDataSize));
  94. //CONSOLELOG(ERROR) << "[" << rtp_filedesc->file_name << "] frame data size: " << frame_cachesize + RtpDataSize << " is too large to be cached";
  95. break;
  96. }
  97. memcpy(frame_cache + frame_cachesize, file_data, RtpDataSize);
  98. frame_cachesize += RtpDataSize;
  99. file_data += RtpDataSize;
  100. if (!rtp_frame) {
  101. if (M) { // at the end of frame
  102. framedata_cb(frame_cache, frame_cachesize, RtpDataSec, RtpDataUSec, is_iframe ? true : false, user_data);
  103. frame_cachesize = 0;
  104. }
  105. }
  106. else {
  107. Buffer_t packet_buffer;
  108. memset(&packet_buffer, 0, sizeof(packet_buffer));
  109. packet_buffer.pData = packet_databuffer;
  110. packet_buffer.DataSize = HeaderSize + RtpDataSize;
  111. rtp_frame->Proc(&packet_buffer);
  112. if (rtp_frame->IsFrameReady()) {
  113. framedata_cb(rtp_frame->GetVideoData(), rtp_frame->GetVideoDataLength(), RtpDataSec, RtpDataUSec, is_iframe ? true : false, user_data);
  114. frame_cachesize = 0;
  115. rtp_frame->CopyFrame(NULL, NULL, NULL, NULL, NULL);
  116. }
  117. }
  118. }
  119. if (fatal_error) {
  120. framedata_cb(NULL, -1, 0, 0, false, user_data);
  121. //CONSOLELOG(ERROR) << "[" << rtp_filedesc->file_name << "] process error: " << (fatal_error == -1 ? "corrupt header." : "partially flush content.");
  122. if (rtp_filedesc->start_timesec != 0 && rtp_filedesc->end_timesec != 0) {
  123. return 0;
  124. }
  125. else {
  126. BLOG_ERROR(fmt::format("[F] {} process error: {}", rtp_filedesc->file_name, (fatal_error == -1 ? "corrupt header." : "partially flush content.")));
  127. return -1;
  128. }
  129. }
  130. assert(!frame_cachesize);
  131. framedata_cb(NULL, frame_cachesize, 0, 0, false, user_data);
  132. return 0;
  133. }
  134. ClearRtpFiles::ClearRtpFiles()
  135. {
  136. //Start();
  137. }
  138. ClearRtpFiles::~ClearRtpFiles()
  139. {
  140. Stop();
  141. std::list<RTPFILEDESC*>::iterator iter;
  142. for (iter = list_src_rtpfiles.begin(); iter != list_src_rtpfiles.end();) {
  143. delete (*iter);
  144. *iter = NULL;
  145. iter = list_src_rtpfiles.erase(iter);
  146. }
  147. list_src_rtpfiles.clear();
  148. for (iter = list_backup_rtpfiles.begin(); iter != list_backup_rtpfiles.end();) {
  149. delete (*iter);
  150. *iter = NULL;
  151. iter = list_backup_rtpfiles.erase(iter);
  152. }
  153. list_backup_rtpfiles.clear();
  154. }
  155. bool ClearRtpFiles::LoadDeviceInfo()
  156. {
  157. char* text = NULL;
  158. FILE* pf = fopen("anycleaner.cfg", "rb+");
  159. if (!pf) {
  160. BLOG_ERROR("open anycleaner.cfg failed");
  161. //printf("open deveice.config failed\n");
  162. return false;
  163. }
  164. fseek(pf, 0, SEEK_END);
  165. long lSize = ftell(pf);
  166. text = (char*)malloc(lSize);
  167. rewind(pf);
  168. fread(text, sizeof(char), lSize, pf);
  169. std::string filedata = std::string(text, lSize);
  170. free(text);
  171. fclose(pf);
  172. nlohmann::json j = nlohmann::json::parse(filedata);
  173. std::string src = j["duty_spool"];
  174. src_path = src;
  175. std::string backup = j["standby_spool"];
  176. backup_path = backup;
  177. checktime = j["check_interval"];
  178. remaining_memory = j["storage_freespace"];
  179. retension_day = j["retension_day"];
  180. return true;
  181. }
  182. int ClearRtpFiles::Get_Folder_List(std::vector<char*>* pVecFolderName, char* folder_name)
  183. {
  184. char fileFound[256];
  185. WIN32_FIND_DATAA info;
  186. HANDLE hp;
  187. char* folder_path = NULL;
  188. sprintf(fileFound, ("%s\\*.*"), folder_name);
  189. hp = FindFirstFileA(fileFound, &info);
  190. if (hp == INVALID_HANDLE_VALUE) return -1;
  191. do {
  192. if ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) continue;
  193. // "."
  194. if (info.cFileName[0] == '.' && info.cFileName[1] == '\0') continue;
  195. // ".."
  196. if (info.cFileName[0] == '.' && info.cFileName[1] == '.' && info.cFileName[2] == '\0') continue;
  197. // find one directory
  198. folder_path = new char[256];
  199. if (!folder_path) break;
  200. sprintf(folder_path, "%s\\%s", folder_name, info.cFileName);
  201. pVecFolderName->push_back(folder_path);
  202. folder_path = NULL;
  203. } while (FindNextFileA(hp, &info));
  204. FindClose(hp);
  205. return 0;
  206. }
  207. int ClearRtpFiles::Get_Date_List(std::vector<char*>* pVecFolderName, char* folder_name)
  208. {
  209. char fileFound[256];
  210. WIN32_FIND_DATAA info;
  211. HANDLE hp;
  212. char* folder_path = NULL;
  213. sprintf(fileFound, ("%s\\*.*"), folder_name);
  214. hp = FindFirstFileA(fileFound, &info);
  215. if (hp == INVALID_HANDLE_VALUE) return -1;
  216. do {
  217. if ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) continue;
  218. // "."
  219. if (info.cFileName[0] == '.' && info.cFileName[1] == '\0') continue;
  220. // ".."
  221. if (info.cFileName[0] == '.' && info.cFileName[1] == '.' && info.cFileName[2] == '\0') continue;
  222. // find one directory
  223. folder_path = new char[256];
  224. if (!folder_path) break;
  225. sprintf(folder_path, "%s\\%s", folder_name, info.cFileName);
  226. pVecFolderName->push_back(folder_path);
  227. folder_path = NULL;
  228. } while (FindNextFileA(hp, &info));
  229. FindClose(hp);
  230. return 0;
  231. }
  232. void ClearRtpFiles::Get_DateFiles(std::vector<char*>* vec_foldernames, const char* src_folder)
  233. {
  234. Get_Date_List(vec_foldernames, (char*)src_folder);
  235. }
  236. void ClearRtpFiles::Get_Folder(std::vector<char*>* vec_foldernames,const char* src_folder)
  237. {
  238. Get_Folder_List(vec_foldernames, (char*)src_folder);
  239. }
  240. int ClearRtpFiles::Rtp_Listfile(std::list<RTPFILEDESC*>* list_rtpfiles, const char* src_folder)
  241. {
  242. std::vector<char*> vec_foldernames;
  243. char* curr_folder = new char[256];
  244. if (!curr_folder) {
  245. //CONSOLELOG(ERROR) << "mem is not enough to process folder: " << src_folder;
  246. return -1;
  247. }
  248. sprintf(curr_folder, "%s", src_folder);
  249. vec_foldernames.push_back(curr_folder);
  250. CDiscHelper::GetFolderName(&vec_foldernames, (char*)src_folder, true);
  251. for (unsigned int f = 0; f < vec_foldernames.size(); f++) {
  252. std::vector<char*> vec_filenames;
  253. CDiscHelper::GetFileName(&vec_filenames, vec_foldernames.at(f));
  254. if (vec_filenames.empty()) {
  255. //CONSOLELOG(INFO) << "there is no files under folder: " << vec_foldernames.at(f);
  256. continue;
  257. }
  258. // #process all the rtp files
  259. for (unsigned int v = 0; v < vec_filenames.size(); v++) {
  260. if (!CDiscHelper::IsMatchExt(vec_filenames.at(v), (char*)".rtp")) continue; // ignore non rtp files
  261. RTPFILEDESC* rtp_filedesc = new RTPFILEDESC;
  262. if (!rtp_filedesc) {
  263. //CONSOLELOG(ERROR) << "mem is limited to process more files.";
  264. break;
  265. }
  266. memset(rtp_filedesc, 0, sizeof(*rtp_filedesc));
  267. sprintf(rtp_filedesc->file_name, "%s", vec_filenames.at(v));
  268. rtp_filedesc->file_size = CDiscHelper::GetFileSize(rtp_filedesc->file_name);
  269. std::string srcdata = std::string(rtp_filedesc->file_name);
  270. std::string data = srcdata;
  271. while (true) {
  272. if (data.npos != data.find("\\")) {
  273. data = data.substr(data.find("\\") + 1);
  274. }
  275. else {
  276. break;
  277. }
  278. }
  279. memcpy(rtp_filedesc->name, data.c_str(), data.size());
  280. //add file Serial number
  281. std::string tmpdata = Get_Filename_Time(rtp_filedesc->name);
  282. rtp_filedesc->file_number = std::stol(tmpdata);
  283. char fold[100] = "";
  284. memcpy(fold, srcdata.c_str(), srcdata.find(data) - 1);
  285. data = std::string(fold);
  286. while (true) {
  287. if (data.npos != data.find("\\")) {
  288. data = data.substr(data.find("\\") + 1);
  289. }
  290. else {
  291. break;
  292. }
  293. }
  294. memcpy(rtp_filedesc->folder, data.c_str(),data.size());
  295. list_rtpfiles->push_back(rtp_filedesc);
  296. }
  297. CDiscHelper::ClearFolderName(&vec_filenames);
  298. }
  299. CDiscHelper::ClearFolderName(&vec_foldernames);
  300. return 0;
  301. }
  302. std::wstring s2ws(const std::string& s)
  303. {
  304. int len; int slength = (int)s.length() + 1;
  305. len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); wchar_t* buf = new wchar_t[len];
  306. MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
  307. std::wstring r(buf);
  308. delete[] buf;
  309. return r;
  310. }
  311. void ClearRtpFiles::Delete_file(std::string filename)
  312. {
  313. {
  314. std::string file = filename;
  315. std::wstring stemp = s2ws(file);
  316. LPCWSTR result = stemp.c_str();
  317. BOOL del = DeleteFile(result);
  318. if (!del) {
  319. DWORD error_rus = GetLastError();
  320. BLOG_DEBUG(fmt::format("[F] *** failed to DeleteFile {},code{} ***", file, error_rus));
  321. }
  322. }
  323. {
  324. std::string file = filename;
  325. file += ".gop";
  326. std::wstring stemp = s2ws(file);
  327. LPCWSTR result = stemp.c_str();
  328. BOOL del = DeleteFile(result);
  329. if (!del) {
  330. DWORD error_rus = GetLastError();
  331. BLOG_DEBUG(fmt::format("[F] *** failed to DeleteFile {},code{} ***", file, error_rus));
  332. }
  333. }
  334. }
  335. void get_Item_ex(std::string src,std::string& head,std::string& end)
  336. {
  337. std::string data = src;
  338. std::string he;
  339. while (true) {
  340. if (data.npos != data.find("\\")) {
  341. he += data.substr(0, data.find("\\") + 1);
  342. data = data.substr(data.find("\\") + 1);
  343. }
  344. else {
  345. break;
  346. }
  347. }
  348. head = he;
  349. end = data;
  350. }
  351. std::string get_Item(std::string src)
  352. {
  353. std::string data = src;
  354. while (true) {
  355. if (data.npos != data.find("\\")) {
  356. data = data.substr(data.find("\\") + 1);
  357. }
  358. else {
  359. break;
  360. }
  361. }
  362. return data;
  363. }
  364. std::string ClearRtpFiles::Get_Filename_Time(std::string src)
  365. {
  366. std::string data = src;
  367. data = data.substr(data.find("-") + 1);
  368. if (data.npos != data.find("-")) {
  369. data = data.substr(0, data.find("-"));
  370. }
  371. else if (data.npos != data.find(".")) {
  372. data = data.substr(0, data.find("."));
  373. }
  374. return data;
  375. }
  376. /*通过调用ShFileOperation来实现整个目录的删除*/
  377. /*只删除单个目录*/
  378. BOOL ClearRtpFiles::SHDeleteFolder(std::string pstrFolder, BOOL bAllowUndo)
  379. {
  380. std::string file = pstrFolder;
  381. std::wstring stemp = s2ws(file);
  382. LPCWSTR result = stemp.c_str();
  383. int iPathLen = wcslen(result);
  384. if (iPathLen >= MAX_PATH)
  385. {
  386. return FALSE;
  387. }
  388. /*确保目录的路径以2个\0结尾*/
  389. TCHAR tczFolder[MAX_PATH + 1];
  390. ZeroMemory(tczFolder, (MAX_PATH + 1) * sizeof(TCHAR));
  391. wcscpy(tczFolder, result);
  392. tczFolder[iPathLen] = _T('\0');
  393. tczFolder[iPathLen + 1] = _T('\0');
  394. SHFILEOPSTRUCT FileOp;
  395. ZeroMemory(&FileOp, sizeof(SHFILEOPSTRUCT));
  396. FileOp.fFlags |= FOF_SILENT; /*不显示进度*/
  397. FileOp.fFlags |= FOF_NOERRORUI; /*不报告错误信息*/
  398. FileOp.fFlags |= FOF_NOCONFIRMATION;/*直接删除,不进行确认*/
  399. FileOp.hNameMappings = NULL;
  400. FileOp.hwnd = NULL;
  401. FileOp.lpszProgressTitle = NULL;
  402. FileOp.wFunc = FO_DELETE;
  403. FileOp.pFrom = tczFolder; /*要删除的目录,必须以2个\0结尾*/
  404. FileOp.pTo = NULL;
  405. /*根据传递的bAllowUndo参数确定是否删除到回收站*/
  406. if (bAllowUndo) {
  407. FileOp.fFlags |= FOF_ALLOWUNDO; /*删除到回收站*/
  408. } else {
  409. FileOp.fFlags &= ~FOF_ALLOWUNDO; /*直接删除,不放入回收站*/
  410. }
  411. /*删除目录*/
  412. if (0 == SHFileOperation(&FileOp)) {
  413. return TRUE;
  414. } else {
  415. return FALSE;
  416. }
  417. }
  418. void ClearRtpFiles::File_Sort(std::list<RTPFILEDESC*>* src_rtpfiles, std::list<RTPFILEDESC*>* dst_rtpfiles)
  419. {
  420. std::list<RTPFILEDESC*>::iterator it_1;
  421. int filesize = (*src_rtpfiles).size();
  422. for (int i = 0; i < filesize; i++) {
  423. it_1 = (*src_rtpfiles).begin();
  424. if ((*src_rtpfiles).size() == 0)
  425. break;
  426. RTPFILEDESC* data = new RTPFILEDESC;
  427. memset(data, 0, sizeof(*data));
  428. data->file_number = 0;
  429. do {
  430. RTPFILEDESC* rtp_filedesc = *it_1++;
  431. if (data->file_number == 0) {
  432. data->file_number = rtp_filedesc->file_number;
  433. memcpy(data->file_name, rtp_filedesc->file_name, 256);
  434. memcpy(data->folder, rtp_filedesc->folder, 256);
  435. data->file_size = rtp_filedesc->file_size;
  436. memcpy(data->name, rtp_filedesc->name,256);
  437. }
  438. else {
  439. if ((data->file_number) > rtp_filedesc->file_number) {
  440. data->file_number = rtp_filedesc->file_number;
  441. memcpy(data->file_name, rtp_filedesc->file_name, 256);
  442. memcpy(data->folder, rtp_filedesc->folder, 256);
  443. data->file_size = rtp_filedesc->file_size;
  444. memcpy(data->name, rtp_filedesc->name, 256);
  445. }
  446. }
  447. } while (it_1 != (*src_rtpfiles).end());
  448. it_1 = (*src_rtpfiles).begin();
  449. for (it_1 = (*src_rtpfiles).begin(); it_1 != (*src_rtpfiles).end();) {
  450. if (!strcmp((*it_1)->name, data->name)){
  451. delete (*it_1);
  452. *it_1 = NULL;
  453. it_1 = (*src_rtpfiles).erase(it_1);
  454. }
  455. else {
  456. it_1++;
  457. }
  458. }
  459. (*dst_rtpfiles).emplace_back(data);
  460. }
  461. for (it_1 = (*src_rtpfiles).begin(); it_1 != (*src_rtpfiles).end();) {
  462. delete (*it_1);
  463. *it_1 = NULL;
  464. it_1 = (*src_rtpfiles).erase(it_1);
  465. }
  466. (*src_rtpfiles).clear();
  467. }
  468. void ClearRtpFiles::Folder_Sort(std::vector<char*>* src_folder, std::vector<char*>* dst_folder)
  469. {
  470. std::vector<char*>::iterator it_1;
  471. std::string data_;
  472. int filesize = (*src_folder).size();
  473. for (int i = 0; i < filesize; i++) {
  474. it_1 = (*src_folder).begin();
  475. if ((*src_folder).size() == 0)
  476. break;
  477. char* data = new char[256];
  478. memset(data, 0, 256);
  479. int file_number = 0;
  480. do {
  481. char* rtp_filedesc = *it_1++;
  482. if (file_number == 0) {
  483. data_ = get_Item(std::string(rtp_filedesc));
  484. file_number = std::stoi(data_);
  485. memcpy(data, rtp_filedesc, 256);
  486. }
  487. else {
  488. data_ = get_Item(std::string(rtp_filedesc));
  489. if ((file_number) > std::stoi(data_)) {
  490. file_number = std::stoi(data_);
  491. memcpy(data, rtp_filedesc, 256);
  492. }
  493. }
  494. } while (it_1 != (*src_folder).end());
  495. it_1 = (*src_folder).begin();
  496. for (it_1 = (*src_folder).begin(); it_1 != (*src_folder).end();) {
  497. if (std::string(*it_1) == std::string(data)) {
  498. delete[] (*it_1);
  499. *it_1 = NULL;
  500. it_1 = (*src_folder).erase(it_1);
  501. }
  502. else {
  503. it_1++;
  504. }
  505. }
  506. (*dst_folder).emplace_back(data);
  507. }
  508. for (it_1 = (*src_folder).begin(); it_1 != (*src_folder).end();) {
  509. delete[] (*it_1);
  510. *it_1 = NULL;
  511. it_1 = (*src_folder).erase(it_1);
  512. }
  513. (*src_folder).clear();
  514. }
  515. int ClearRtpFiles::Get_MaxSize_File(std::list<RTPFILEDESC*>* list_rtpfiles)
  516. {
  517. int max_filesize = 0;
  518. std::list<RTPFILEDESC*>::iterator it;
  519. it = (*list_rtpfiles).begin();
  520. do {
  521. if ((*list_rtpfiles).size() == 0)
  522. break;
  523. RTPFILEDESC* rtp_filedesc = *it++;
  524. max_filesize = max_filesize > rtp_filedesc->file_size ? max_filesize : rtp_filedesc->file_size;
  525. } while (it != (*list_rtpfiles).end());
  526. return max_filesize;
  527. }
  528. void ClearRtpFiles::Check_Channels(std::string src, std::string backup)
  529. {
  530. std::string last_day;
  531. std::string next_day;
  532. std::string src_day;
  533. std::string src_tmp;
  534. std::string head_;
  535. std::string last_src_tmp;
  536. std::vector<char*> src_daytmp_name;
  537. std::vector<char*> src_day_name;
  538. std::vector<char*> backup_day_name;
  539. Get_Folder(&src_daytmp_name, src.c_str());
  540. Folder_Sort(&src_daytmp_name, &src_day_name);
  541. Get_Folder(&src_daytmp_name, backup.c_str());
  542. Folder_Sort(&src_daytmp_name, &backup_day_name);
  543. std::vector<char*>::iterator it_char;
  544. bool ishave = false;
  545. for (it_char = backup_day_name.begin(); it_char != backup_day_name.end(); it_char++) {
  546. //Whether the same date exists
  547. std::string bak_day = get_Item(*it_char);
  548. if (std::stoi(std::string(bak_day)) >= 20231108) {
  549. BLOG_DEBUG(fmt::format("don't delete 11month"));
  550. break;
  551. }
  552. //查找是否存在主目录的同一天
  553. for (auto s : src_day_name) {
  554. src_tmp = std::string(s);
  555. get_Item_ex(src_tmp, head_, src_day);
  556. if (std::stoi(src_day) == std::stoi(bak_day))
  557. {
  558. int daytime = std::stoi(src_day);
  559. char buff_[100] = "";
  560. sprintf(buff_, "%d", daytime - 1);
  561. last_day = head_ + std::string(buff_);
  562. memset(buff_, 0, 100);
  563. sprintf(buff_, "%d", daytime + 1);
  564. next_day = head_ + std::string(buff_);
  565. ishave = true;
  566. break;
  567. }
  568. }
  569. if (!ishave)
  570. continue;
  571. ishave = false;
  572. std::list<RTPFILEDESC*> list_tmp_rtpfiles;
  573. Rtp_Listfile(&list_tmp_rtpfiles, *it_char);
  574. File_Sort(&list_tmp_rtpfiles, &list_backup_rtpfiles);
  575. BLOG_DEBUG(fmt::format("list_backup_rtpfiles backup_folder{}, size {}", *it_char, list_backup_rtpfiles.size()));
  576. //获取当天内rtp最大的文件大小
  577. int max_filesize = Get_MaxSize_File(&list_backup_rtpfiles);
  578. Buffer_t mem_buffer;
  579. memset(&mem_buffer, 0, sizeof(mem_buffer));
  580. mem_buffer.BufSize = ((max_filesize + 64 - 1) / 64) * 64;
  581. mem_buffer.pData = new char[mem_buffer.BufSize + (1024 * 1024 * 30)];
  582. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  583. std::list<RTPFILEDESC*>::iterator it;
  584. it = list_backup_rtpfiles.begin();
  585. std::list<RTPFILEDESC*>::iterator it_erase;
  586. do {
  587. if (list_backup_rtpfiles.size() == 0)
  588. break;
  589. it_erase = it;
  590. RTPFILEDESC* rtp_filedesc = *it++;
  591. // read in time informatiion
  592. if (rtp_proc(rtp_filedesc, &mem_buffer, NULL, rtpcallback_timeinfo, rtp_filedesc)) {
  593. if (rtp_filedesc != list_backup_rtpfiles.back()) BLOG_ERROR(fmt::format("Check_Channels[F] {} is corrupt. ... skip the file ...", rtp_filedesc->file_name));
  594. delete (*it_erase);
  595. *it_erase = NULL;
  596. list_backup_rtpfiles.erase(it_erase);
  597. }
  598. else {
  599. //获取到rtp时间
  600. //开始对比单个文件是否存在主目录内
  601. if (rtp_filedesc->start_timesec == rtp_filedesc->end_timesec) {
  602. //测试出现过start_timesec和end_timesec相同的情况
  603. BLOG_ERROR(fmt::format("Time is same,Delete fiel:{},time:{}~{}", rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  604. #ifdef _DEBUG1
  605. if (std::stoi(std::string(rtp_filedesc->folder)) < 20231108)
  606. Delete_file(rtp_filedesc->file_name);
  607. #endif
  608. }
  609. else {
  610. if (last_src_tmp != src_tmp) {
  611. std::list<RTPFILEDESC*>::iterator iter;
  612. for (iter = list_lastDay_rtpfiles.begin(); iter != list_lastDay_rtpfiles.end();) {
  613. delete (*iter);
  614. *iter = NULL;
  615. iter = list_lastDay_rtpfiles.erase(iter);
  616. }
  617. list_lastDay_rtpfiles.clear();
  618. for (iter = list_nextDay_rtpfiles.begin(); iter != list_nextDay_rtpfiles.end();) {
  619. delete (*iter);
  620. *iter = NULL;
  621. iter = list_nextDay_rtpfiles.erase(iter);
  622. }
  623. list_nextDay_rtpfiles.clear();
  624. for (iter = list_localDay_rtpfiles.begin(); iter != list_localDay_rtpfiles.end();) {
  625. delete (*iter);
  626. *iter = NULL;
  627. iter = list_localDay_rtpfiles.erase(iter);
  628. }
  629. list_localDay_rtpfiles.clear();
  630. Rtp_Listfile(&list_tmp_rtpfiles, last_day.c_str());
  631. File_Sort(&list_tmp_rtpfiles, &list_lastDay_rtpfiles);
  632. Rtp_Listfile(&list_tmp_rtpfiles, next_day.c_str());
  633. File_Sort(&list_tmp_rtpfiles, &list_nextDay_rtpfiles);
  634. Rtp_Listfile(&list_tmp_rtpfiles, src_tmp.c_str());
  635. File_Sort(&list_tmp_rtpfiles, &list_localDay_rtpfiles);
  636. BLOG_DEBUG("new list_localDay_rtpfiles");
  637. }
  638. last_src_tmp = src_tmp;
  639. bool check_last = false;
  640. bool check_next = false;
  641. //BLOG_DEBUG(fmt::format("bakcup:{},time:{}~{}", rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  642. Is_Same_Times(&list_localDay_rtpfiles, rtp_filedesc, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec, check_last, check_next);
  643. if (check_last) {
  644. BLOG_DEBUG("Is_LastSame_Times");
  645. Is_LastSame_Times(&list_lastDay_rtpfiles, rtp_filedesc, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec);
  646. }
  647. else if (check_next) {
  648. BLOG_DEBUG("Is_NextSame_Times");
  649. Is_NextSame_Times(&list_nextDay_rtpfiles, rtp_filedesc, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec);
  650. }
  651. }
  652. }
  653. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  654. } while (it != list_backup_rtpfiles.end());
  655. delete[] mem_buffer.pData;
  656. mem_buffer.pData = NULL;
  657. //删除备份的空目录
  658. Clear_EmptyDirectory(it_char);
  659. Free_Rtpfiles();
  660. }
  661. for (it_char = src_day_name.begin(); it_char != src_day_name.end();) {
  662. delete[](*it_char);
  663. *it_char = NULL;
  664. it_char = src_day_name.erase(it_char);
  665. }
  666. src_day_name.clear();
  667. for (it_char = backup_day_name.begin(); it_char != backup_day_name.end();) {
  668. delete[](*it_char);
  669. *it_char = NULL;
  670. it_char = backup_day_name.erase(it_char);
  671. }
  672. backup_day_name.clear();
  673. }
  674. void ClearRtpFiles::Free_Rtpfiles()
  675. {
  676. std::list<RTPFILEDESC*>::iterator it;
  677. it = list_backup_rtpfiles.begin();
  678. for (it = list_backup_rtpfiles.begin(); it != list_backup_rtpfiles.end();) {
  679. delete (*it);
  680. *it = NULL;
  681. it = list_backup_rtpfiles.erase(it);
  682. }
  683. list_backup_rtpfiles.clear();
  684. std::list<RTPFILEDESC*>::iterator iter;
  685. for (iter = list_lastDay_rtpfiles.begin(); iter != list_lastDay_rtpfiles.end();) {
  686. delete (*iter);
  687. *iter = NULL;
  688. iter = list_lastDay_rtpfiles.erase(iter);
  689. }
  690. list_lastDay_rtpfiles.clear();
  691. for (iter = list_nextDay_rtpfiles.begin(); iter != list_nextDay_rtpfiles.end();) {
  692. delete (*iter);
  693. *iter = NULL;
  694. iter = list_nextDay_rtpfiles.erase(iter);
  695. }
  696. list_nextDay_rtpfiles.clear();
  697. for (iter = list_localDay_rtpfiles.begin(); iter != list_localDay_rtpfiles.end();) {
  698. delete (*iter);
  699. *iter = NULL;
  700. iter = list_localDay_rtpfiles.erase(iter);
  701. }
  702. list_localDay_rtpfiles.clear();
  703. }
  704. void ClearRtpFiles::Clear_EmptyDirectory(std::vector<char*>::iterator it_char)
  705. {
  706. std::wstring stemp = s2ws(*it_char);
  707. LPCWSTR result = stemp.c_str();
  708. BOOL ret = PathIsDirectoryEmpty(result);
  709. if (ret) {
  710. BLOG_DEBUG(fmt::format("Delete BACKUP Folder {}", *it_char));
  711. #ifdef _DEBUG1
  712. SHDeleteFolder(*it_char, false);
  713. #endif
  714. }
  715. }
  716. void ClearRtpFiles::Get_Channels(const char* backup_folder, const char* src_folder)
  717. {
  718. Get_Folder(&vec_src_foldernames, src_folder);
  719. if (vec_src_foldernames.empty()) {
  720. BLOG_ERROR(fmt::format("[F] *** failed to load src_folder file vec_src_foldernames {}***", src_folder));
  721. return;
  722. }
  723. Get_Folder(&vec_back_foldernames, backup_folder);
  724. if (vec_back_foldernames.empty()) {
  725. BLOG_ERROR(fmt::format("[F] *** failed to load src_folder file vec_back_foldernames {}***", backup_folder));
  726. return;
  727. }
  728. for (auto src : vec_src_foldernames) {
  729. std::string src_ = std::string(src);
  730. std::string src_channel = get_Item(src_);
  731. for (auto back : vec_back_foldernames) {
  732. std::string bak = std::string(back);
  733. std::string back_channel = get_Item(bak);
  734. if (back_channel == src_channel) {
  735. Check_Channels(src_, bak);
  736. break;
  737. }
  738. }
  739. }
  740. //剩余空间小于要求值,删除主存储
  741. std::vector<char*> src_daytmp_name;
  742. std::string serial = std::string(vec_src_foldernames.front());
  743. serial = serial.substr(0, serial.find("\\"));
  744. int gb_data = Get_Disk_Free(serial);
  745. BLOG_DEBUG(fmt::format("Get_Disk_Free {}", gb_data));
  746. int index = 0;
  747. int i = 0;
  748. if (remaining_memory >= gb_data) {
  749. for (auto s : vec_src_foldernames) {
  750. Get_DateFiles(&src_daytmp_name, s);
  751. Folder_Sort(&src_daytmp_name, &vec_src_date_folder);
  752. if (vec_src_date_folder.size() >= retension_day) {
  753. index = vec_src_date_folder.size() - retension_day;
  754. for (auto d : vec_src_date_folder) {
  755. if (i >= index)
  756. break;
  757. BLOG_DEBUG(fmt::format("Delete SRC Folder {}", d));
  758. #ifdef _DEBUG1
  759. //SHDeleteFolder(d, false);
  760. #endif
  761. i++;
  762. }
  763. }
  764. std::vector<char*>::iterator iter;
  765. for (iter = vec_src_date_folder.begin(); iter != vec_src_date_folder.end();) {
  766. delete[] (*iter);
  767. *iter = NULL;
  768. iter = vec_src_date_folder.erase(iter);
  769. }
  770. vec_src_date_folder.clear();
  771. i = 0;
  772. }
  773. }
  774. std::vector<char*>::iterator iter;
  775. for (iter = vec_src_foldernames.begin(); iter != vec_src_foldernames.end();) {
  776. delete[] (*iter);
  777. *iter = NULL;
  778. iter = vec_src_foldernames.erase(iter);
  779. }
  780. vec_src_foldernames.clear();
  781. for (iter = vec_back_foldernames.begin(); iter != vec_back_foldernames.end();) {
  782. delete (*iter);
  783. *iter = NULL;
  784. iter = vec_back_foldernames.erase(iter);
  785. }
  786. vec_back_foldernames.clear();
  787. }
  788. void ClearRtpFiles::Is_NextSame_Times(std::list<RTPFILEDESC*>* list_rtpfiles, RTPFILEDESC* paramer, unsigned int starttime, unsigned int endtime)
  789. {
  790. std::list<RTPFILEDESC*>::iterator it = (*list_rtpfiles).begin();
  791. int max_filesize = 0;
  792. do {
  793. RTPFILEDESC* rtp_filedesc = *it++;
  794. max_filesize = max_filesize > rtp_filedesc->file_size ? max_filesize : rtp_filedesc->file_size;
  795. } while (it != (*list_rtpfiles).end());
  796. it = (*list_rtpfiles).begin();
  797. Buffer_t mem_buffer;
  798. memset(&mem_buffer, 0, sizeof(mem_buffer));
  799. mem_buffer.BufSize = ((max_filesize + 64 - 1) / 64) * 64;
  800. mem_buffer.pData = new char[mem_buffer.BufSize + (1024 * 1024 * 30)];
  801. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  802. std::list<RTPFILEDESC*>::iterator it_erase;
  803. int index = 0;
  804. bool isbreak = false;
  805. while (it != (*list_rtpfiles).end()) {
  806. it_erase = it;
  807. RTPFILEDESC* rtp_filedesc = *it++;
  808. if (rtp_filedesc->start_timesec != 0)
  809. continue;
  810. index++;
  811. //检查上一天,从最后面的rtp获取时间
  812. if (index <= 20) {
  813. if (rtp_proc(rtp_filedesc, &mem_buffer, NULL, rtpcallback_timeinfo, rtp_filedesc)) {
  814. if (rtp_filedesc != (*list_rtpfiles).back()) BLOG_ERROR(fmt::format("Is_NextSame_Times[F] {} is corrupt. ... skip the file ...", rtp_filedesc->file_name));
  815. delete (*it_erase);
  816. *it_erase = NULL;
  817. (*list_rtpfiles).erase(it_erase);
  818. //continue;
  819. }
  820. else {
  821. int day_ = std::stoi(std::string(paramer->folder));
  822. if (starttime >= rtp_filedesc->start_timesec && endtime <= rtp_filedesc->end_timesec) {
  823. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  824. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  825. #ifdef _DEBUG1
  826. if (std::stoi(std::string(paramer->folder)) < 20231108)
  827. Delete_file(paramer->file_name);
  828. #endif
  829. isbreak = true;
  830. }
  831. else if (starttime < rtp_filedesc->start_timesec && endtime > rtp_filedesc->start_timesec && endtime < rtp_filedesc->end_timesec) {
  832. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  833. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  834. #ifdef _DEBUG1
  835. if (std::stoi(std::string(paramer->folder)) < 20231108)
  836. Delete_file(paramer->file_name);
  837. #endif
  838. isbreak = true;
  839. }
  840. else if (starttime >= rtp_filedesc->end_timesec) {
  841. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  842. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  843. #ifdef _DEBUG1
  844. if (std::stoi(std::string(paramer->folder)) < 20231108)
  845. Delete_file(paramer->file_name);
  846. #endif
  847. isbreak = true;
  848. }
  849. if (isbreak) {
  850. delete (*it_erase);
  851. *it_erase = NULL;
  852. (*list_rtpfiles).erase(it_erase);
  853. break;
  854. }
  855. }
  856. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  857. }
  858. }
  859. if (mem_buffer.pData) {
  860. delete[] mem_buffer.pData;
  861. mem_buffer.pData = NULL;
  862. }
  863. }
  864. void ClearRtpFiles::Is_LastSame_Times(std::list<RTPFILEDESC*>* list_rtpfiles, RTPFILEDESC* paramer, unsigned int starttime, unsigned int endtime)
  865. {
  866. std::list<RTPFILEDESC*>::iterator it = (*list_rtpfiles).begin();
  867. int max_filesize = 0;
  868. do {
  869. RTPFILEDESC* rtp_filedesc = *it++;
  870. max_filesize = max_filesize > rtp_filedesc->file_size ? max_filesize : rtp_filedesc->file_size;
  871. } while (it != (*list_rtpfiles).end());
  872. it = (*list_rtpfiles).begin();
  873. //文件时间信息
  874. Buffer_t mem_buffer;
  875. memset(&mem_buffer, 0, sizeof(mem_buffer));
  876. mem_buffer.BufSize = ((max_filesize + 64 - 1) / 64) * 64;
  877. mem_buffer.pData = new char[mem_buffer.BufSize + (1024 * 1024 * 30)];
  878. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  879. std::list<RTPFILEDESC*>::iterator it_erase;
  880. int count = (*list_rtpfiles).size();
  881. int index = 0;
  882. bool isbreak = false;
  883. while (it != (*list_rtpfiles).end()) {
  884. it_erase = it;
  885. RTPFILEDESC* rtp_filedesc = *it++;
  886. index++;
  887. //检查上一天,从最后面的rtp获取时间
  888. if (count - index <= 20) {
  889. //mem_buffer.BufSize = ((rtp_filedesc->file_size + 64 - 1) / 64) * 64;
  890. //mem_buffer.pData = new char[mem_buffer.BufSize + (1024 * 1024 * 30)];
  891. //memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  892. if (rtp_proc(rtp_filedesc, &mem_buffer, NULL, rtpcallback_timeinfo, rtp_filedesc)) {
  893. if (rtp_filedesc != (*list_rtpfiles).back()) BLOG_ERROR(fmt::format("Is_LastSame_Times[F] {} is corrupt. ... skip the file ...", rtp_filedesc->file_name));
  894. delete (*it_erase);
  895. *it_erase = NULL;
  896. (*list_rtpfiles).erase(it_erase);
  897. //continue;
  898. }
  899. else {
  900. if (starttime <= rtp_filedesc->end_timesec && endtime >= rtp_filedesc->end_timesec) {
  901. //BLOG_DEBUG(fmt::format("Is_LastSame_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  902. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  903. #ifdef _DEBUG1
  904. if (std::stoi(std::string(paramer->folder)) < 20231108)
  905. Delete_file(paramer->file_name);
  906. #endif
  907. isbreak = true;
  908. }
  909. else if (starttime >= rtp_filedesc->start_timesec && starttime <= rtp_filedesc->end_timesec && endtime > rtp_filedesc->end_timesec) {
  910. //BLOG_DEBUG(fmt::format("Is_LastSame_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  911. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  912. #ifdef _DEBUG1
  913. if (std::stoi(std::string(paramer->folder)) < 20231108)
  914. Delete_file(paramer->file_name);
  915. #endif
  916. isbreak = true;
  917. }
  918. else if (endtime <= rtp_filedesc->end_timesec) {
  919. //BLOG_DEBUG(fmt::format("Is_LastSame_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  920. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  921. #ifdef _DEBUG1
  922. if (std::stoi(std::string(paramer->folder)) < 20231108)
  923. Delete_file(paramer->file_name);
  924. #endif
  925. isbreak = true;
  926. }
  927. if (isbreak) {
  928. delete (*it_erase);
  929. *it_erase = NULL;
  930. (*list_rtpfiles).erase(it_erase);
  931. break;
  932. }
  933. }
  934. //delete[] mem_buffer.pData;
  935. //mem_buffer.pData = NULL;
  936. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  937. }
  938. }
  939. if (mem_buffer.pData) {
  940. delete[] mem_buffer.pData;
  941. mem_buffer.pData = NULL;
  942. }
  943. }
  944. void ClearRtpFiles::Is_Same_Times(std::list<RTPFILEDESC*>* list_rtpfiles, RTPFILEDESC* paramer, unsigned int starttime, unsigned int endtime, bool& check_last, bool& check_next)
  945. {
  946. std::list<RTPFILEDESC*>::iterator it = (*list_rtpfiles).begin();
  947. int max_filesize = 0;
  948. do {
  949. RTPFILEDESC* rtp_filedesc = *it++;
  950. max_filesize = max_filesize > rtp_filedesc->file_size ? max_filesize : rtp_filedesc->file_size;
  951. } while (it != (*list_rtpfiles).end());
  952. it = (*list_rtpfiles).begin();
  953. Buffer_t mem_buffer;
  954. memset(&mem_buffer, 0, sizeof(mem_buffer));
  955. mem_buffer.BufSize = ((max_filesize + 64 - 1) / 64) * 64;
  956. mem_buffer.pData = new char[mem_buffer.BufSize + (1024 * 1024 * 30)];
  957. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  958. std::list<RTPFILEDESC*>::iterator it_erase;
  959. bool flag = false;
  960. bool last_flag = false;
  961. bool next_flag = false;
  962. bool isbreak = false;
  963. bool is_first_file = true;
  964. do {
  965. it_erase = it;
  966. RTPFILEDESC* rtp_filedesc = *it++;
  967. // read in time informatiion
  968. if (rtp_proc(rtp_filedesc, &mem_buffer, NULL, rtpcallback_timeinfo, rtp_filedesc)) {
  969. if (rtp_filedesc != (*list_rtpfiles).back()) BLOG_ERROR(fmt::format("Is_Same_Times[F] {} is corrupt. ... skip the file ...", rtp_filedesc->file_name));
  970. delete (*it_erase);
  971. *it_erase = NULL;
  972. (*list_rtpfiles).erase(it_erase);
  973. }
  974. else {
  975. //BLOG_DEBUG(fmt::format("Is_Same_Times src:{},time:{}~{}", rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  976. int day_ = std::stoi(std::string(paramer->folder));
  977. //Home directory contains all have
  978. if (!flag && starttime >= rtp_filedesc->start_timesec && endtime <= rtp_filedesc->end_timesec) {
  979. #ifdef _DEBUG1
  980. if (std::stoi(std::string(paramer->folder)) < 20231108)
  981. Delete_file(paramer->file_name);
  982. #endif
  983. isbreak = true;
  984. }
  985. //right intersect
  986. else if (!flag && starttime >= rtp_filedesc->start_timesec && starttime <= rtp_filedesc->end_timesec && endtime > rtp_filedesc->end_timesec) {
  987. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  988. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  989. #ifdef _DEBUG1
  990. if (std::stoi(std::string(paramer->folder)) < 20231108)
  991. Delete_file(paramer->file_name);
  992. #endif
  993. isbreak = true;
  994. }
  995. //right,需要检查下一天前面几个的rtp文件时间
  996. else if (!flag && starttime >= rtp_filedesc->end_timesec ) {
  997. if (rtp_filedesc == (*list_rtpfiles).back()) {
  998. flag = true;
  999. next_flag = true;
  1000. }
  1001. }
  1002. //left intersect
  1003. else if (!flag && starttime < rtp_filedesc->start_timesec && endtime >= rtp_filedesc->start_timesec && endtime < rtp_filedesc->end_timesec) {
  1004. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  1005. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  1006. #ifdef _DEBUG1
  1007. if (std::stoi(std::string(paramer->folder)) < 20231108)
  1008. Delete_file(paramer->file_name);
  1009. #endif
  1010. isbreak = true;
  1011. }
  1012. //left需要检查上一天末尾几个的rtp文件时间
  1013. else if (!flag && endtime < rtp_filedesc->start_timesec && is_first_file) {
  1014. flag = true;
  1015. last_flag = true;
  1016. }
  1017. else if (!flag && endtime < rtp_filedesc->start_timesec && !is_first_file) {
  1018. #ifdef _DEBUG1
  1019. if (std::stoi(std::string(paramer->folder)) < 20231108)
  1020. Delete_file(paramer->file_name);
  1021. #endif
  1022. isbreak = true;
  1023. }
  1024. if (isbreak) {
  1025. delete (*it_erase);
  1026. *it_erase = NULL;
  1027. (*list_rtpfiles).erase(it_erase);
  1028. break;
  1029. }
  1030. }
  1031. is_first_file = false;
  1032. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  1033. if (last_flag)
  1034. break;
  1035. } while (it != (*list_rtpfiles).end());
  1036. if (mem_buffer.pData) {
  1037. delete[] mem_buffer.pData;
  1038. mem_buffer.pData = NULL;
  1039. }
  1040. check_last = last_flag;
  1041. check_next = next_flag;
  1042. }
  1043. int ClearRtpFiles::Get_Disk_Free(std::string serial)
  1044. {
  1045. int pSize = MultiByteToWideChar(CP_OEMCP, 0, serial.c_str(), serial.size() + 1, NULL, 0);
  1046. TCHAR* buf = new wchar_t[pSize];
  1047. MultiByteToWideChar(CP_OEMCP, 0, serial.c_str(), serial.size() + 1, buf, pSize);
  1048. ULARGE_INTEGER available, total, free; //ULARGE_INTEGER 一个64位的无符号整型值
  1049. /*if (GetDiskFreeSpaceEx(TEXT("D:"), (ULARGE_INTEGER*)&available, (ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free)) {*/
  1050. if (GetDiskFreeSpaceEx(buf, (ULARGE_INTEGER*)&available, (ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free)) {
  1051. //printf(" | 总容量 = %.2f GB,可用空间 = %.2f GB,空闲空间 = %.2f GB\n",GB(total), GB(available), GB(free));
  1052. }
  1053. else {
  1054. BLOG_ERROR(fmt::format("[F] *** failed to Get_Disk_Free ***"));
  1055. //puts("获取容量信息失败");
  1056. }
  1057. int available_ = GB(available);
  1058. return available_;
  1059. }
  1060. void ClearRtpFiles::init()
  1061. {
  1062. life_worker = new CAppLifeThread();
  1063. life_worker->Start();
  1064. Start();
  1065. }
  1066. void ClearRtpFiles::Action()
  1067. {
  1068. while (!IsAborted()) {
  1069. Get_Channels(backup_path.c_str(), src_path.c_str());
  1070. std::this_thread::sleep_for(std::chrono::minutes(checktime));
  1071. }
  1072. }