int mips_test(int test_blocksize, double max_sd_variation_ratio, double ratio_failed_test_blocks_ok) { int foo, bar; int return_val = 0; int i, j; int num_tests = 0; int num_warnings = 0; double mean, raw_mean; double variance, raw_variance; int test[test_blocksize], raw_test[test_blocksize]; double testblocks_sd[test_blocksize], raw_testblocks_sd[test_blocksize]; double testblocks_mean[test_blocksize], raw_testblocks_mean[test_blocksize]; dprintf(D_ALWAYS, "SysAPI: Running mips_test.\n"); dprintf(D_ALWAYS, "\tI will test sysapi_mips (and sysapi_mips_raw) in\n"); dprintf(D_ALWAYS, "\tblocks of %d tests, and take the standard\n", test_blocksize); dprintf(D_ALWAYS, "\tdeviation of those test blocks. If the standard\n"); dprintf(D_ALWAYS, "\tdeviation is above %2f%% of the average,\n", max_sd_variation_ratio); dprintf(D_ALWAYS, "\tthe mips reported are erratic and the test block\n"); dprintf(D_ALWAYS, "\tis considered a failure.\n"); dprintf(D_ALWAYS, "\tI will run %d test blocks, and if more than %2f%% of those blocks\n", test_blocksize, ratio_failed_test_blocks_ok*100); dprintf(D_ALWAYS, "\tfail, this entire test fails.\n"); foo = sysapi_mips_raw(); dprintf(D_ALWAYS, "SysAPI: Initial sysapi_mips_raw -> %d\n", foo); bar = sysapi_mips(); dprintf(D_ALWAYS, "SysAPI: Initial sysapi_mips -> %d\n", bar); for (i=0; i<test_blocksize; i++) { raw_mean = 0; raw_variance = 0; for (j=0; j<test_blocksize; j++) { raw_test[j] = sysapi_mips_raw(); raw_mean += raw_test[j]; dprintf(D_ALWAYS, "SysAPI: Testblock %d, test %d: Raw mips: %d\n", i, j, raw_test[j]); if (raw_test[j] <= 0) { dprintf(D_ALWAYS, "SysAPI: ERROR! Raw mips (%d) is negative!\n", foo); return_val = 1; } } raw_mean /= test_blocksize; raw_testblocks_mean[i] = raw_mean; dprintf(D_ALWAYS, "SysAPI: Testblock %d, mean: Raw mips: %.1f\n", i, raw_mean ); /* Test if there were any unusually large jumps in the means of the testblocks */ num_tests++; if ( delta_check( i, raw_testblocks_mean, max_sd_variation_ratio, "Raw" ) ) { num_warnings++; } for (j=0; j<test_blocksize; j++) { raw_variance += (raw_test[j] - raw_mean)*(raw_test[j] - raw_mean); } raw_variance /= test_blocksize; raw_testblocks_sd[i] = sqrt(raw_variance); dprintf(D_ALWAYS, "SysAPI: Standard deviation of raw testblock %d is: %d MIPS\n", i, (int)raw_testblocks_sd[i]); num_tests++; if ( sd_check( i, raw_mean, raw_testblocks_sd, max_sd_variation_ratio, "Raw" ) ) { num_warnings++; } } if (((double)num_warnings/(double)num_tests) > max_sd_variation_ratio) { dprintf(D_ALWAYS, "SysAPI: ERROR! Failing because %d raw MIPS tests failed > %d (%2.2f%%).\n", num_warnings, (int)(max_sd_variation_ratio*test_blocksize), max_sd_variation_ratio*100); return_val = return_val | 1; } dprintf(D_ALWAYS, "\n\n"); num_warnings = 0; for (i=0; i<test_blocksize; i++) { mean = 0; variance = 0; for (j=0; j<test_blocksize; j++) { test[j] = sysapi_mips_raw(); mean += test[j]; dprintf(D_ALWAYS, "SysAPI: Testblock %d, test %d: Cooked mips: %d\n", i, j, test[j]); if (test[j] <= 0) { dprintf(D_ALWAYS, "SysAPI: ERROR! Cooked mips (%d) is negative!\n", foo); return_val = 1; } } mean /= test_blocksize; testblocks_mean[i] = mean; dprintf(D_ALWAYS, "SysAPI: Testblock %d, mean : Cooked mips: %.1f\n", i, mean); /* Test if there were any unusually large jumps in the means of the testblocks */ num_tests++; if ( delta_check( i, testblocks_mean, max_sd_variation_ratio, "Cooked" ) ) { num_warnings++; } for (j=0; j<test_blocksize; j++) { variance += (test[j] - mean)*(test[j] - mean); } variance /= test_blocksize; testblocks_sd[i] = sqrt(variance); dprintf(D_ALWAYS, "SysAPI: Standard deviation of testblock %d is: %d MIPS\n", i, (int)testblocks_sd[i]); num_tests++; if ( sd_check( i, mean, testblocks_sd, max_sd_variation_ratio, "Cooked" ) ) { num_warnings++; } } if (((double)num_warnings/(double)num_tests) > max_sd_variation_ratio) { dprintf(D_ALWAYS, "SysAPI: ERROR! Failing because %d cooked MIPS tests failed > %d (%2.2f%%).\n", num_warnings, (int)(max_sd_variation_ratio*test_blocksize), max_sd_variation_ratio*100); return_val = return_val | 1; } return return_val; }
FILE_LIST *open_file_search_by_type(int channel,int year,int month,int day,unsigned int record_type) { int i,j,k; int flag = 0; int start_minute,end_minute; char index_file_name[MAX_PATH]; FILE_NODE *file_node = NULL; FILE_LIST *file_list = NULL; RECORD_FILE_INDEX index; pthread_mutexattr_t attr; int disk_num; int temp_end=0; struct stat st; int size = 0; //int m,s; char path[MAX_PATH]; char file_path[MAX_PATH]; char file_full_name[MAX_PATH]; char file_name[MAX_FILE_NAME]; //char file_name_end[MAX_FILE_NAME]; DIR *dir = NULL; struct dirent *ptr; char temp[12]; //int file_start_hour,file_start_minute,file_start_second; //int file_end_hour,file_end_minute,file_end_second; int file_start_minute; start_minute = end_minute = 0; file_list = (FILE_LIST *)malloc(sizeof(FILE_LIST)); if(file_list == NULL) return NULL; memset(file_list,0,sizeof(file_list)); //创建互斥变量 pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_FAST_NP); //PTHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_RECURSIVE_NP 递归互斥 2005.4.4 [ZHB] pthread_mutex_init(&file_list->mutex,&attr); pthread_mutexattr_destroy(&attr); #ifdef SD_STORAGE disk_num = sd_check(); if (disk_num < 0) { return NULL; } disk_num = 1; #else disk_num = get_hard_disk_num(); #endif for(i=0; i<disk_num; i++) { #ifdef SD_STORAGE if (!sd_get_mount_flag()) { continue; } #else if (!hd_get_mount_flag(i,0)) { continue; } #endif sprintf(path,"/record/hd%02d/%02d/ch%02d/%04d-%02d-%02d",i,0,channel,year,month,day); for(j=0; j<24; j++) /* 文件列表中只给出时间段(具体到播放时再根据时间段来找到相应的录像文件) */ { #if 1 sprintf(index_file_name,"/record/hd%02d/%02d/ch%02d/%04d-%02d-%02d/%02d/index.db", i,0,channel,year,month,day,j); if(read_record_index_file(index_file_name,&index) == -1) continue ; sprintf(file_path,"%s/%02d",path,j); dir = opendir(file_path); if(dir == NULL) { continue; } // 分析一个小时内同一类型有多少个连续录像文件段 flag = 0; for(k=0; k<60; k++) { if((index.file_type[k] & record_type) != 0) { temp_end = k; if(flag == 0) { start_minute = k; flag = 1; //size = 0; } if(flag == 1 && k == 59) { flag = 0; end_minute = k; file_node = (FILE_NODE *)malloc(sizeof(FILE_NODE)); if(file_node == NULL) continue; #ifdef FILESIZE_COMPUTE printf("LIB: hour: %d; start_minute: %d; end_minute: %d\n", j,start_minute, end_minute); size = 0; rewinddir(dir); while((ptr = readdir(dir)) != NULL) { if(strcmp(ptr->d_name,".") == 0 || strcmp(ptr->d_name,"..") == 0 || strcmp(ptr->d_name,"index.db") == 0) // zym 0602 { continue; } strcpy(file_name,ptr->d_name); memcpy(temp,&file_name[3],2); file_start_minute = atoi(temp); if(file_start_minute >= start_minute && file_start_minute <= end_minute) { //int ret; //printf("LIB: file_start_minute == %d\n", file_start_minute); sprintf(file_full_name,"%s/%s",file_path,file_name); if(stat(file_full_name, &st) == 0) { size += st.st_size; } } //if(file_start_minute >= end_minute) // break; } printf("LIB: finish: size == %d\n", size); file_node->size = size /1024; // size k #endif sprintf(file_node->fullname,"%02d:%02d --- %02d:%02d", j,start_minute,j,end_minute); file_node->start_hour = j; file_node->end_hour = j; file_node->start_minute = start_minute; file_node->end_minute = end_minute; file_node->prev = NULL; file_node->next = NULL; add_file_node_to_list(file_list,file_node); } } else { if(flag == 1) { flag = 0; end_minute = temp_end; //k; //cyg 2005.4.15 //printf("open_file_search_by_type == %d %d\n", k, end_minute); file_node = (FILE_NODE *)malloc(sizeof(FILE_NODE)); if(file_node == NULL) continue; #ifdef FILESIZE_COMPUTE printf("LIB: hour: %d; start_minute: %d; end_minute: %d\n", j,start_minute,end_minute); size = 0; rewinddir(dir); while((ptr = readdir(dir)) != NULL) { if(strcmp(ptr->d_name,".") == 0 || strcmp(ptr->d_name,"..") == 0 || strcmp(ptr->d_name,"index.db") == 0) // zym 0602 { continue; } strcpy(file_name,ptr->d_name); memcpy(temp,&file_name[3],2); file_start_minute = atoi(temp); if(file_start_minute >= start_minute && file_start_minute <= end_minute) { //int ret; //printf("LIB: file_start_minute == %d\n", file_start_minute); sprintf(file_full_name,"%s/%s",file_path,file_name); if(stat(file_full_name, &st) == 0) { size += st.st_size; } } //if(file_start_minute >= end_minute) // break; } printf("LIB: finish: size == %d\n", size); file_node->size = size /1024; // size k #endif sprintf(file_node->fullname,"%02d:%02d --- %02d:%02d",j,start_minute,j,end_minute); file_node->start_hour = j; file_node->end_hour = j; file_node->start_minute = start_minute; file_node->end_minute = end_minute; file_node->prev = NULL; file_node->next = NULL; add_file_node_to_list(file_list,file_node); } } } closedir(dir); #endif } } return file_list; }
/****************************************************************************** * 函数名称:open_file_search * 功能描述:创建搜索文件链表,根据给定的路径,按时间查找录像文件 * 输入参数:int channel 指定通道号 * int play_backup_files 文件类型:数据、备份文件 * int year 指定年度 * int month 指定月份 * int day 指定日期 * int start_hour 开始时间-小时 * int start_minute 开始时间-分钟 * int start_second 开始时间-秒 * int end_hour 结束时间-小时 * int end_minute 结束时间-分钟 * int end_second 结束时间-秒 * 输出参数:无 * 返 回 值:FILE_LIST * 搜索文件链表 * 修改记录: 无 * 其他说明: 无 ********************************************************************************/ FILE_LIST *open_file_search(int channel, int play_backup_files, int year, int month, int day, int start_hour,int start_minute,int start_second, int end_hour,int end_minute,int end_second) { int i = 0; int hd = 0; //硬盘 int disk_num = 0; int partition_no = 0; //分区号: 0: <录像文件> 1: <备份文件> int file_start_hour,file_start_minute,file_start_second; int file_end_hour,file_end_minute,file_end_second; int play_time; int second_num; char temp[16]; char path[MAX_PATH]; char file_path[MAX_PATH]; char file_name[MAX_FILE_NAME]; char file_name1[MAX_FILE_NAME]; char file_full_name[MAX_PATH]; char file_name_start[MAX_FILE_NAME]; char file_name_end[MAX_FILE_NAME]; DIR *dir = NULL; FILE_NODE *file_node = NULL; FILE_LIST *file_list = NULL; FILE_INFO *file_info = NULL; struct dirent *ptr = NULL; pthread_mutexattr_t attr; partition_no = play_backup_files; if (partition_no !=0 && partition_no != 1) { partition_no = 0; } #ifdef SD_STORAGE disk_num = sd_check(); if (disk_num < 0) { return NULL; } disk_num = 1; #else disk_num = get_hard_disk_num(); if (disk_num <= 0) { return NULL; } #endif sprintf(file_name_start, "%02d-%02d-%02d.tds", start_hour, start_minute, start_second); sprintf(file_name_end, "%02d-%02d-%02d.tds", end_hour, end_minute, end_second); if (strncmp(file_name_start, file_name_end, 20) > 0) { return NULL; } file_list = (FILE_LIST *)malloc(sizeof(FILE_LIST)); if (file_list == NULL) { return NULL; } memset(file_list, 0, sizeof(file_list)); //创建互斥变量 pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_FAST_NP); //PTHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_RECURSIVE_NP 递归互斥 2005.4.4 [ZHB] pthread_mutex_init(&file_list->mutex, &attr); pthread_mutexattr_destroy(&attr); //遍历所有硬盘 for (hd=0; hd<disk_num; hd++) { #ifdef SD_STORAGE if (!sd_get_mount_flag()) { continue; } #else if (!hd_get_mount_flag(hd, partition_no)) { continue; } #endif memset(path, 0, MAX_PATH); sprintf(path, "/record/hd%02d/%02d/ch%02d/%04d-%02d-%02d", hd, partition_no, channel, year, month, day); for (i=start_hour; i<=end_hour; i++) { sprintf(file_path, "%s/%02d" ,path, i); //目录不存在 dir = opendir(file_path); if (dir == NULL) { continue; } while ((ptr = readdir(dir)) != NULL) { #if 1 //空目录,没有录像文件 if (strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0 || strcmp(ptr->d_name, "index.tds") == 0) { continue; } #endif strcpy(file_name, ptr->d_name); sprintf(file_full_name, "%s/%s", file_path, file_name); // [zhb][add][2006-04-13] //sscanf(file_name, "%02d-%02d-%02d.tds", &file_start_hour, &file_start_minute, &file_start_second); //printf("search file1 =%s %s %s %s\n", ptr->d_name, file_full_name, file_path, file_name); //小时 memcpy(temp, &file_name[0], 2); file_start_hour = atoi(temp); //分钟 memcpy(temp, &file_name[3], 2); file_start_minute = atoi(temp); //秒 memcpy(temp, &file_name[6], 2); file_start_second = atoi(temp); //获取文件节点信息 file_info = mp4_record_open_file(file_full_name); if (file_info == NULL) { printf("mp4_record_open_file() Failed!\n"); continue; } play_time = mp4_record_get_play_time(file_info) / 1000; mp4_record_close_file(file_info); if (play_time <= 0) { printf("mp4_record_get_play_time() Failed!\n"); continue; } file_end_hour = file_start_hour + play_time/3600; file_end_minute = file_start_hour + (play_time%3600)/60; file_end_second = file_start_hour + play_time%60; /* second_num = file_start_hour*60*60 + file_start_minute*60 + file_start_second + play_time; //printf("search file2 =%d %d %d %d %d\n", file_start_hour, file_start_minute, file_start_second, play_time, second_num); file_end_hour = second_num / (60*60); file_end_minute = (second_num - file_end_hour*60*60) / 60; file_end_second = second_num - file_end_hour*60*60 - file_end_minute*60; sprintf(file_name1,"%02d-%02d-%02d.tds",file_end_hour,file_end_minute,file_end_second); if (strcmp(file_name1,file_name_start) < 0 || strcmp(file_name, file_name_start) < 0 || strcmp(file_name, file_name_end) > 0) { //printf("search file4 =%s %s %s\n", file_name1, file_name_start, file_name_end); continue; } //printf("search file3 =%s %d %d %d\n", file_name1, file_end_hour, file_end_minute, file_end_second); */ file_node = (FILE_NODE *)malloc(sizeof(FILE_NODE)); if (file_node == NULL) { printf("Can not allocate memory for FILE_NODE!\n"); continue; } strcpy(file_node->name,file_name); sprintf(file_node->fullname,"%s/%s",file_path,file_name); file_node->prev = NULL; file_node->next = NULL; add_file_node_to_list(file_list,file_node); } closedir(dir); } } return file_list; }
FILE_LIST *open_file_search_by_type(int channel,int year,int month,int day,unsigned int record_type) { int i,j,k; int flag = 0; int start_minute,end_minute; char index_file_name[MAX_PATH]; FILE_NODE *file_node = NULL; FILE_LIST *file_list = NULL; RECORD_FILE_INDEX index; pthread_mutexattr_t attr; int disk_num; int temp_end=0; char file_name[MAX_PATH]; struct stat st; int size = 0; int m,s; start_minute = end_minute = 0; file_list = (FILE_LIST *)malloc(sizeof(FILE_LIST)); if(file_list == NULL) return NULL; memset(file_list,0,sizeof(file_list)); //创建互斥变量 pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_FAST_NP); //PTHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_RECURSIVE_NP 递归互斥 2005.4.4 [ZHB] pthread_mutex_init(&file_list->mutex,&attr); pthread_mutexattr_destroy(&attr); #ifdef SD_STORAGE disk_num = sd_check(); if (disk_num < 0) { return NULL; } disk_num = 1; #else disk_num = get_hard_disk_num(); #endif for (i=0; i<disk_num; i++) { #ifdef SD_STORAGE if (!sd_get_mount_flag()) { continue; } #else if (!hd_get_mount_flag(i, 0)) { continue; } #endif // 文件列表中只给出时间段(具体到播放时再根据时间段来找到相应的录像文件) for (j=0; j<24; j++) { #if 1 sprintf(index_file_name,"/record/hd%02d/%02d/ch%02d/%04d-%02d-%02d/%02d/index.db", i,0,channel,year,month,day,j); if (read_record_index_file(index_file_name,&index) == -1) { continue ; } // 分析一个小时内同一类型有多少个连续录像文件段 flag = 0; for (k=0; k<60; k++) { if ((index.file_type[k] & record_type) != 0) { temp_end = k; if (flag == 0) // 找到第一个文件 { start_minute = k; flag = 1; size = 0; } if (flag == 1 && k == 59) { flag = 0; end_minute = k; file_node = (FILE_NODE *)malloc(sizeof(FILE_NODE)); if (file_node == NULL) { continue; } #ifdef FILESIZE_COMPUTE for (m=start_minute; m<=end_minute; m++) { for (s=0; s<60; s++) { sprintf(file_name, "/record/hd%02d/%02d/ch%02d/%04d-%02d-%02d/%02d/%02d-%2d-%02d.tds",i,0,channel,year,month,day,j,j,m,s); #if 0 if(stat(file_name, &st) < 0) printf("LIB: stat error; may the file not exit \n"); else #endif if (stat(file_name, &st) == 0) { size += st.st_size; break; } } } file_node->size = size /1024; // size k size = 0; #endif sprintf(file_node->fullname,"%02d:%02d --- %02d:%02d", j,start_minute,j,end_minute); file_node->start_hour = j; file_node->end_hour = j; file_node->start_minute = start_minute; file_node->end_minute = end_minute; file_node->prev = NULL; file_node->next = NULL; add_file_node_to_list(file_list,file_node); } } else { if (flag == 1) { flag = 0; end_minute = temp_end; file_node = (FILE_NODE *)malloc(sizeof(FILE_NODE)); if (file_node == NULL) { continue; } #ifdef FILESIZE_COMPUTE for (m=start_minute; m<=end_minute; m++) { for (s=0; s<60; s++) { sprintf(file_name, "/record/hd%02d/%02d/ch%02d/%04d-%02d-%02d/%02d/%02d-%2d-%02d.tds",i,0,channel,year,month,day,j,j,m,s); #if 0 if(stat(file_name, &st) < 0) printf("LIB: stat error; may the file not exit \n"); else #endif if(stat(file_name, &st) == 0) { size += st.st_size; break; } } } file_node->size = size /1024; // size k size = 0; #endif sprintf(file_node->fullname,"%02d:%02d --- %02d:%02d",j,start_minute,j,end_minute); file_node->start_hour = j; file_node->end_hour = j; file_node->start_minute = start_minute; file_node->end_minute = end_minute; file_node->prev = NULL; file_node->next = NULL; add_file_node_to_list(file_list,file_node); } } } #endif } } return file_list; }
/****************************************************************************** * 函数名称:find_back_file_by_type * 功能描述:搜索备份文件 * 输入参数:int channel 指定通道号 * int year 指定年度 * int month 指定月份 * int day 指定日期 * unsigned int record_type录像类型 * 输出参数:无 * 返 回 值:成功: 1; 失败: 0 * 修改记录: 无 * 其他说明: 无 ********************************************************************************/ int find_back_file_by_type(int channel,int year,int month,int day,unsigned int record_type) { int i,j; int ret; char index_file_name[MAX_FILE_NAME]; int disk_num; // 查找所有硬盘 #ifdef SD_STORAGE disk_num = sd_check(); if (disk_num < 0) { return -1; } disk_num = 1; #else disk_num = get_hard_disk_num(); #endif for (i=0; i<disk_num; i++) { #ifdef SD_STORAGE if (!sd_get_mount_flag()) { continue; } #else if (!hd_get_mount_flag(i,0)) { continue; } #endif for(j=0; j<24; j++) { sprintf(index_file_name,"/record/hd%02d/%02d/ch%02d/%04d-%02d-%02d/%02d/index.db", i,1,channel,year,month,day,j); //ret = search_record_index_file_by_type(index_file_name,record_type); ret = search_record_index_file_by_type_ext(index_file_name,record_type); // Add the code by lvjh, 2008-04-29 if (ret == 1) { return 1; } #if 0 dir = opendir(file_path); if(dir == NULL) { continue; } while((ptr = readdir(dir)) != NULL) { sprintf(file_full_name,"%s/%s",file_path,ptr->d_name); type = mp4_record_get_record_type(file_full_name); if (type != -1) { type &= record_type; if (type != 0) return 1; } } #endif } } return 0; }