RtpFilesCleaner.cpp 41 KB

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