RtpFilesCleaner.cpp 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272
  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. std::vector<char*> src_daytmp_name;
  729. //磁盤空間小於某個值刪除主目录最舊的一天文件
  730. std::string serial = std::string(vec_src_foldernames.front());
  731. serial = serial.substr(0, serial.find("\\"));
  732. int gb_data = Get_Disk_Free(serial);
  733. BLOG_DEBUG(fmt::format("Get_Disk_Free {}", gb_data));
  734. if (remaining_memory >= gb_data) {
  735. for (auto s : vec_src_foldernames) {
  736. Get_DateFiles(&src_daytmp_name, s);
  737. Folder_Sort(&src_daytmp_name, &vec_src_date_folder);
  738. for (auto d : vec_src_date_folder) {
  739. BLOG_DEBUG(fmt::format("remaining_memory Delete SRC Folder {}", d));
  740. #ifdef _DEBUG1
  741. //SHDeleteFolder(d, false);
  742. #endif
  743. std::vector<char*>::iterator iter;
  744. for (iter = vec_src_date_folder.begin(); iter != vec_src_date_folder.end();) {
  745. delete[](*iter);
  746. *iter = NULL;
  747. iter = vec_src_date_folder.erase(iter);
  748. }
  749. vec_src_date_folder.clear();
  750. break;
  751. }
  752. }
  753. }
  754. //首先保证主目录存留retension_day设置的天数
  755. int index = 0;
  756. int i = 0;
  757. for (auto s : vec_src_foldernames) {
  758. Get_DateFiles(&src_daytmp_name, s);
  759. Folder_Sort(&src_daytmp_name, &vec_src_date_folder);
  760. if (vec_src_date_folder.size() >= retension_day) {
  761. index = vec_src_date_folder.size() - retension_day;
  762. BLOG_DEBUG(fmt::format("index {},retension_day {}", index,retension_day));
  763. for (auto d : vec_src_date_folder) {
  764. if (i >= index)
  765. break;
  766. BLOG_DEBUG(fmt::format("retension_day Delete SRC Folder {}", d));
  767. #ifdef _DEBUG1
  768. //SHDeleteFolder(d, false);
  769. #endif
  770. i++;
  771. }
  772. }
  773. std::vector<char*>::iterator iter;
  774. for (iter = vec_src_date_folder.begin(); iter != vec_src_date_folder.end();) {
  775. delete[](*iter);
  776. *iter = NULL;
  777. iter = vec_src_date_folder.erase(iter);
  778. }
  779. vec_src_date_folder.clear();
  780. i = 0;
  781. index = 0;
  782. }
  783. for (auto src : vec_src_foldernames) {
  784. std::string src_ = std::string(src);
  785. std::string src_channel = get_Item(src_);
  786. for (auto back : vec_back_foldernames) {
  787. std::string bak = std::string(back);
  788. std::string back_channel = get_Item(bak);
  789. if (back_channel == src_channel) {
  790. Check_Channels(src_, bak);
  791. break;
  792. }
  793. }
  794. }
  795. std::vector<char*>::iterator iter;
  796. for (iter = vec_src_foldernames.begin(); iter != vec_src_foldernames.end();) {
  797. delete[] (*iter);
  798. *iter = NULL;
  799. iter = vec_src_foldernames.erase(iter);
  800. }
  801. vec_src_foldernames.clear();
  802. for (iter = vec_back_foldernames.begin(); iter != vec_back_foldernames.end();) {
  803. delete (*iter);
  804. *iter = NULL;
  805. iter = vec_back_foldernames.erase(iter);
  806. }
  807. vec_back_foldernames.clear();
  808. }
  809. void ClearRtpFiles::Is_NextSame_Times(std::list<RTPFILEDESC*>* list_rtpfiles, RTPFILEDESC* paramer, unsigned int starttime, unsigned int endtime)
  810. {
  811. std::list<RTPFILEDESC*>::iterator it = (*list_rtpfiles).begin();
  812. int max_filesize = 0;
  813. do {
  814. RTPFILEDESC* rtp_filedesc = *it++;
  815. max_filesize = max_filesize > rtp_filedesc->file_size ? max_filesize : rtp_filedesc->file_size;
  816. } while (it != (*list_rtpfiles).end());
  817. it = (*list_rtpfiles).begin();
  818. Buffer_t mem_buffer;
  819. memset(&mem_buffer, 0, sizeof(mem_buffer));
  820. mem_buffer.BufSize = ((max_filesize + 64 - 1) / 64) * 64;
  821. mem_buffer.pData = new char[mem_buffer.BufSize + (1024 * 1024 * 30)];
  822. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  823. std::list<RTPFILEDESC*>::iterator it_erase;
  824. int index = 0;
  825. bool isbreak = false;
  826. while (it != (*list_rtpfiles).end()) {
  827. it_erase = it;
  828. RTPFILEDESC* rtp_filedesc = *it++;
  829. if (rtp_filedesc->start_timesec != 0)
  830. continue;
  831. index++;
  832. //检查上一天,从最后面的rtp获取时间
  833. if (index <= 20) {
  834. if (rtp_proc(rtp_filedesc, &mem_buffer, NULL, rtpcallback_timeinfo, rtp_filedesc)) {
  835. if (rtp_filedesc != (*list_rtpfiles).back()) BLOG_ERROR(fmt::format("Is_NextSame_Times[F] {} is corrupt. ... skip the file ...", rtp_filedesc->file_name));
  836. delete (*it_erase);
  837. *it_erase = NULL;
  838. (*list_rtpfiles).erase(it_erase);
  839. //continue;
  840. }
  841. else {
  842. int day_ = std::stoi(std::string(paramer->folder));
  843. if (starttime >= rtp_filedesc->start_timesec && endtime <= rtp_filedesc->end_timesec) {
  844. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  845. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  846. #ifdef _DEBUG1
  847. if (std::stoi(std::string(paramer->folder)) < 20231108)
  848. Delete_file(paramer->file_name);
  849. #endif
  850. isbreak = true;
  851. }
  852. else if (starttime < rtp_filedesc->start_timesec && endtime > rtp_filedesc->start_timesec && endtime < rtp_filedesc->end_timesec) {
  853. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  854. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  855. #ifdef _DEBUG1
  856. if (std::stoi(std::string(paramer->folder)) < 20231108)
  857. Delete_file(paramer->file_name);
  858. #endif
  859. isbreak = true;
  860. }
  861. else if (starttime >= rtp_filedesc->end_timesec) {
  862. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  863. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  864. #ifdef _DEBUG1
  865. if (std::stoi(std::string(paramer->folder)) < 20231108)
  866. Delete_file(paramer->file_name);
  867. #endif
  868. isbreak = true;
  869. }
  870. if (isbreak) {
  871. delete (*it_erase);
  872. *it_erase = NULL;
  873. (*list_rtpfiles).erase(it_erase);
  874. break;
  875. }
  876. }
  877. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  878. }
  879. }
  880. if (mem_buffer.pData) {
  881. delete[] mem_buffer.pData;
  882. mem_buffer.pData = NULL;
  883. }
  884. }
  885. void ClearRtpFiles::Is_LastSame_Times(std::list<RTPFILEDESC*>* list_rtpfiles, RTPFILEDESC* paramer, unsigned int starttime, unsigned int endtime)
  886. {
  887. std::list<RTPFILEDESC*>::iterator it = (*list_rtpfiles).begin();
  888. int max_filesize = 0;
  889. do {
  890. RTPFILEDESC* rtp_filedesc = *it++;
  891. max_filesize = max_filesize > rtp_filedesc->file_size ? max_filesize : rtp_filedesc->file_size;
  892. } while (it != (*list_rtpfiles).end());
  893. it = (*list_rtpfiles).begin();
  894. //文件时间信息
  895. Buffer_t mem_buffer;
  896. memset(&mem_buffer, 0, sizeof(mem_buffer));
  897. mem_buffer.BufSize = ((max_filesize + 64 - 1) / 64) * 64;
  898. mem_buffer.pData = new char[mem_buffer.BufSize + (1024 * 1024 * 30)];
  899. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  900. std::list<RTPFILEDESC*>::iterator it_erase;
  901. int count = (*list_rtpfiles).size();
  902. int index = 0;
  903. bool isbreak = false;
  904. while (it != (*list_rtpfiles).end()) {
  905. it_erase = it;
  906. RTPFILEDESC* rtp_filedesc = *it++;
  907. index++;
  908. //检查上一天,从最后面的rtp获取时间
  909. if (count - index <= 20) {
  910. //mem_buffer.BufSize = ((rtp_filedesc->file_size + 64 - 1) / 64) * 64;
  911. //mem_buffer.pData = new char[mem_buffer.BufSize + (1024 * 1024 * 30)];
  912. //memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  913. if (rtp_proc(rtp_filedesc, &mem_buffer, NULL, rtpcallback_timeinfo, rtp_filedesc)) {
  914. if (rtp_filedesc != (*list_rtpfiles).back()) BLOG_ERROR(fmt::format("Is_LastSame_Times[F] {} is corrupt. ... skip the file ...", rtp_filedesc->file_name));
  915. delete (*it_erase);
  916. *it_erase = NULL;
  917. (*list_rtpfiles).erase(it_erase);
  918. //continue;
  919. }
  920. else {
  921. if (starttime <= rtp_filedesc->end_timesec && endtime >= rtp_filedesc->end_timesec) {
  922. //BLOG_DEBUG(fmt::format("Is_LastSame_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  923. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  924. #ifdef _DEBUG1
  925. if (std::stoi(std::string(paramer->folder)) < 20231108)
  926. Delete_file(paramer->file_name);
  927. #endif
  928. isbreak = true;
  929. }
  930. else if (starttime >= rtp_filedesc->start_timesec && starttime <= rtp_filedesc->end_timesec && endtime > rtp_filedesc->end_timesec) {
  931. //BLOG_DEBUG(fmt::format("Is_LastSame_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  932. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  933. #ifdef _DEBUG1
  934. if (std::stoi(std::string(paramer->folder)) < 20231108)
  935. Delete_file(paramer->file_name);
  936. #endif
  937. isbreak = true;
  938. }
  939. else if (endtime <= rtp_filedesc->end_timesec) {
  940. //BLOG_DEBUG(fmt::format("Is_LastSame_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  941. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  942. #ifdef _DEBUG1
  943. if (std::stoi(std::string(paramer->folder)) < 20231108)
  944. Delete_file(paramer->file_name);
  945. #endif
  946. isbreak = true;
  947. }
  948. if (isbreak) {
  949. delete (*it_erase);
  950. *it_erase = NULL;
  951. (*list_rtpfiles).erase(it_erase);
  952. break;
  953. }
  954. }
  955. //delete[] mem_buffer.pData;
  956. //mem_buffer.pData = NULL;
  957. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  958. }
  959. }
  960. if (mem_buffer.pData) {
  961. delete[] mem_buffer.pData;
  962. mem_buffer.pData = NULL;
  963. }
  964. }
  965. void ClearRtpFiles::Is_Same_Times(std::list<RTPFILEDESC*>* list_rtpfiles, RTPFILEDESC* paramer, unsigned int starttime, unsigned int endtime, bool& check_last, bool& check_next)
  966. {
  967. std::list<RTPFILEDESC*>::iterator it = (*list_rtpfiles).begin();
  968. int max_filesize = 0;
  969. do {
  970. RTPFILEDESC* rtp_filedesc = *it++;
  971. max_filesize = max_filesize > rtp_filedesc->file_size ? max_filesize : rtp_filedesc->file_size;
  972. } while (it != (*list_rtpfiles).end());
  973. it = (*list_rtpfiles).begin();
  974. Buffer_t mem_buffer;
  975. memset(&mem_buffer, 0, sizeof(mem_buffer));
  976. mem_buffer.BufSize = ((max_filesize + 64 - 1) / 64) * 64;
  977. mem_buffer.pData = new char[mem_buffer.BufSize + (1024 * 1024 * 30)];
  978. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  979. std::list<RTPFILEDESC*>::iterator it_erase;
  980. bool flag = false;
  981. bool last_flag = false;
  982. bool next_flag = false;
  983. bool isbreak = false;
  984. bool is_first_file = true;
  985. do {
  986. it_erase = it;
  987. RTPFILEDESC* rtp_filedesc = *it++;
  988. // read in time informatiion
  989. if (rtp_proc(rtp_filedesc, &mem_buffer, NULL, rtpcallback_timeinfo, rtp_filedesc)) {
  990. if (rtp_filedesc != (*list_rtpfiles).back()) BLOG_ERROR(fmt::format("Is_Same_Times[F] {} is corrupt. ... skip the file ...", rtp_filedesc->file_name));
  991. delete (*it_erase);
  992. *it_erase = NULL;
  993. (*list_rtpfiles).erase(it_erase);
  994. }
  995. else {
  996. //BLOG_DEBUG(fmt::format("Is_Same_Times src:{},time:{}~{}", rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  997. int day_ = std::stoi(std::string(paramer->folder));
  998. //Home directory contains all have
  999. if (!flag && starttime >= rtp_filedesc->start_timesec && endtime <= rtp_filedesc->end_timesec) {
  1000. #ifdef _DEBUG1
  1001. if (std::stoi(std::string(paramer->folder)) < 20231108)
  1002. Delete_file(paramer->file_name);
  1003. #endif
  1004. isbreak = true;
  1005. }
  1006. //right intersect
  1007. else if (!flag && starttime >= rtp_filedesc->start_timesec && starttime <= rtp_filedesc->end_timesec && endtime > rtp_filedesc->end_timesec) {
  1008. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  1009. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  1010. #ifdef _DEBUG1
  1011. if (std::stoi(std::string(paramer->folder)) < 20231108)
  1012. Delete_file(paramer->file_name);
  1013. #endif
  1014. isbreak = true;
  1015. }
  1016. //right,需要检查下一天前面几个的rtp文件时间
  1017. else if (!flag && starttime >= rtp_filedesc->end_timesec ) {
  1018. if (rtp_filedesc == (*list_rtpfiles).back()) {
  1019. flag = true;
  1020. next_flag = true;
  1021. }
  1022. }
  1023. //left intersect
  1024. else if (!flag && starttime < rtp_filedesc->start_timesec && endtime >= rtp_filedesc->start_timesec && endtime < rtp_filedesc->end_timesec) {
  1025. //BLOG_DEBUG(fmt::format("Is_Same_Times Delete_file {},time:{}~{},src:{},time:{}~{}", paramer->file_name, paramer->start_timesec,
  1026. // paramer->end_timesec, rtp_filedesc->file_name, rtp_filedesc->start_timesec, rtp_filedesc->end_timesec));
  1027. #ifdef _DEBUG1
  1028. if (std::stoi(std::string(paramer->folder)) < 20231108)
  1029. Delete_file(paramer->file_name);
  1030. #endif
  1031. isbreak = true;
  1032. }
  1033. //left需要检查上一天末尾几个的rtp文件时间
  1034. else if (!flag && endtime < rtp_filedesc->start_timesec && is_first_file) {
  1035. flag = true;
  1036. last_flag = true;
  1037. }
  1038. else if (!flag && endtime < rtp_filedesc->start_timesec && !is_first_file) {
  1039. #ifdef _DEBUG1
  1040. if (std::stoi(std::string(paramer->folder)) < 20231108)
  1041. Delete_file(paramer->file_name);
  1042. #endif
  1043. isbreak = true;
  1044. }
  1045. if (isbreak) {
  1046. delete (*it_erase);
  1047. *it_erase = NULL;
  1048. (*list_rtpfiles).erase(it_erase);
  1049. break;
  1050. }
  1051. }
  1052. is_first_file = false;
  1053. memset(mem_buffer.pData, 0, mem_buffer.BufSize + (1024 * 1024 * 30));
  1054. if (last_flag)
  1055. break;
  1056. } while (it != (*list_rtpfiles).end());
  1057. if (mem_buffer.pData) {
  1058. delete[] mem_buffer.pData;
  1059. mem_buffer.pData = NULL;
  1060. }
  1061. check_last = last_flag;
  1062. check_next = next_flag;
  1063. }
  1064. int ClearRtpFiles::Get_Disk_Free(std::string serial)
  1065. {
  1066. int pSize = MultiByteToWideChar(CP_OEMCP, 0, serial.c_str(), serial.size() + 1, NULL, 0);
  1067. TCHAR* buf = new wchar_t[pSize];
  1068. MultiByteToWideChar(CP_OEMCP, 0, serial.c_str(), serial.size() + 1, buf, pSize);
  1069. ULARGE_INTEGER available, total, free; //ULARGE_INTEGER 一个64位的无符号整型值
  1070. /*if (GetDiskFreeSpaceEx(TEXT("D:"), (ULARGE_INTEGER*)&available, (ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free)) {*/
  1071. if (GetDiskFreeSpaceEx(buf, (ULARGE_INTEGER*)&available, (ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free)) {
  1072. //printf(" | 总容量 = %.2f GB,可用空间 = %.2f GB,空闲空间 = %.2f GB\n",GB(total), GB(available), GB(free));
  1073. }
  1074. else {
  1075. BLOG_ERROR(fmt::format("[F] *** failed to Get_Disk_Free ***"));
  1076. //puts("获取容量信息失败");
  1077. }
  1078. int available_ = GB(available);
  1079. return available_;
  1080. }
  1081. void ClearRtpFiles::init()
  1082. {
  1083. life_worker = new CAppLifeThread();
  1084. life_worker->Start();
  1085. Start();
  1086. }
  1087. void ClearRtpFiles::Action()
  1088. {
  1089. while (!IsAborted()) {
  1090. Get_Channels(backup_path.c_str(), src_path.c_str());
  1091. std::this_thread::sleep_for(std::chrono::minutes(checktime));
  1092. }
  1093. }