📄 pthread_enc.c
字号:
peo->info_picture.event_indicator |= 0x0040; // frame_sensor_indicator set } else { /* insert sensor clear bit */ peo->info_picture.event_indicator &= 0xff9f; // frame_sensor_indicator clear } } else { /* insert sensor clear bit */ peo->info_picture.event_indicator &= 0xff9f; // frame_sensor_indicator clear } } /* write event info */ peo->p_mux_buf[peo->info_picture.start_fp + 13] = peo->info_picture.event_indicator; return SUCCESS;}RETURN write_stream_to_harddisk(ENC_OBJECT *peo){ UNS16 enable_fwrite; UNS32 size_temp; peo->psp = gp_setup_param; enable_fwrite = FALSE; if (peo->psp->enc_ch[peo->info_picture.ch].flag_conti_rec) { enable_fwrite = TRUE; } if (peo->psp->enc_ch[peo->info_picture.ch].motion.flag && enable_fwrite == FALSE) { if (peo->info_picture.event_indicator & 0x0008) { enable_fwrite = TRUE; } } if (peo->psp->enc_ch[peo->info_picture.ch].sensor.flag_in && enable_fwrite == FALSE) { if (peo->info_picture.event_indicator & 0x0040) { enable_fwrite = TRUE; } } if (enable_fwrite == TRUE) { /* PASS : if it isn't start of picture */ if (peo->info_picture.start_flag) { /* whitefe-20041004@add: fix bug for backward play */ /* write previous packet length info. to stream */ peo->p_mux_buf[peo->info_picture.start_fp + 11] = #if 1//xchannel modify peo->prev_packet_length & 0x0000ffff; peo->p_mux_buf[peo->info_picture.start_fp + 10] = (peo->p_mux_buf[peo->info_picture.start_fp + 10] & 0xff00) | ((peo->prev_packet_length & 0x00ff0000)>>16); /* save current packet length info. */ peo->prev_packet_length = (peo->p_mux_buf[peo->info_picture.start_fp + 12] << 8) | ((peo->p_mux_buf[peo->info_picture.start_fp + 13] & 0xff00) >> 8);#else//org (peo->prev_packet_length & 0xffff0000) >> 16; peo->p_mux_buf[peo->info_picture.start_fp + 10] = peo->p_mux_buf[peo->info_picture.start_fp + 10] & 0x00ff | peo->prev_packet_length & 0xff00; /* save current packet length info. */ peo->prev_packet_length = (peo->p_mux_buf[peo->info_picture.start_fp + 13] & 0x00ff) << 24 | peo->p_mux_buf[peo->info_picture.start_fp + 12] << 8;#endif /* save end file pointer to Global DB */ peo->db_nrec.end_fp = ftell(peo->p_fd_ps); } /* write to hard disk */ #ifndef LOOPTHROUGH_MODE fwrite(peo->p_mux_buf + TX_BUF_SIZE, sizeof(UNS16), peo->info_picture.size/2, peo->p_fd_ps); fflush(peo->p_fd_ps);#endif } return SUCCESS; }RETURN update_rec_file(ENC_OBJECT *peo){ S8 cur_date[16]; S8 cur_time[16]; S8 end_date[16]; S8 end_time[16]; S32 min_rest; S32 sec_rest; struct tm end_tm; S8 v_mode[2] = "n"; S8 resolution[2] = "C"; S8 multi_ch[2] = "m"; S16 ii; S16 count = 0; UNS8 tmp_str[32]; /* xchannel-20050510@add-bug fix: when the split frame, processing */ if ( (peo->info_picture.time >= peo->time_end ) && (peo->info_picture.last_flag)) { /* 1st. close video stream file */ memcpy(&end_tm, localtime(&peo->time_end), sizeof(struct tm)); sprintf(end_date,"%04d%02d%02d", end_tm.tm_year+1900, end_tm.tm_mon + 1, end_tm.tm_mday); sprintf(end_time,"%02d%02d%02d", end_tm.tm_hour, end_tm.tm_min, end_tm.tm_sec); /* update db info */ strcpy(peo->db_nrec.end_time, end_time); /* close file */ fclose(peo->p_fd_ps); /* 2nd. update global db info */ if (check_dummy_file(peo) == TRUE) { /* update normal db */ if (at2041_update_db_normal(peo) == FAILURE) { m_ERROR("pthread_enc.c:error In function 'at2041_update_db_normal'\n"); return FAILURE; } } /* 3rd. open video stream file */ peo->psp = gp_setup_param; /* NTSC/PAL */ if (peo->psp->gp.video_form == NTSC) { strcpy(v_mode, "n"); } else { strcpy(v_mode, "p"); } /* D1/HARF_D1/CIF */ if (peo->psp->gp.resolution == D1) { strcpy(resolution, "D"); } else if (peo->psp->gp.resolution == CIF) { strcpy(resolution, "C"); } /* single/multi-channel */ for (ii = 0; ii < MAX_CH_NUM; ii++) {#if 1//xchannel add /* when the continue on/off */ if(peo->psp->enc_ch[ii].flag_conti_rec) if (peo->psp->enc_ch[ii].frame_rate != 0) count++; /* when the motion on/off */ if(peo->psp->enc_ch[ii].motion.flag) count++; /* when the sensor on/off */ if(peo->psp->enc_ch[ii].sensor.flag_in) count++; /* when the schedule on/off */ if(peo->psp->enc_ch[ii].schedule.flag) count++;#endif } if (count > 1) { strcpy(multi_ch, "m"); } else { strcpy(multi_ch, "s"); } /* get current free space disk */ GET_DIR_NAME(&tmp_str, gv_cur_disk_id); strcpy(peo->dname_ps, tmp_str); sprintf(peo->fname_ps,"%s%s_%s_%s%s%s.ps", peo->dname_ps, end_date, end_time, v_mode, resolution, multi_ch); if ( !(peo->p_fd_ps = fopen(peo->fname_ps, "wb")) ) { m_ERROR("pthread_enc.c:error In function 'fopen'\n"); return FAILURE; } /* update db info */ strcpy(peo->db_nrec.start_time, cur_time); /* calculate time for closing file */ min_rest = end_tm.tm_min%(g_rec_time_list[peo->psp ->sys.disk.slice_time]); sec_rest = end_tm.tm_sec + min_rest*60; peo->time_end = peo->time_end + ((g_rec_time_list[peo->psp ->sys.disk.slice_time])*60 - sec_rest); /* 4th. insert pack and program header */ insert_program_header(gp_setup_param); } return SUCCESS; }BOOL check_dummy_file(ENC_OBJECT *peo){ struct stat stat_file; stat(peo->fname_ps, &stat_file); m_DEBUG(" file : %s, size : %d\n", peo->fname_ps, stat_file.st_size); if (stat_file.st_size <= DUMMY_FILE_SIZE) { /* video file delete */ remove(peo->fname_ps); return FALSE; } return TRUE;}RETURN at2041_update_db_normal(ENC_OBJECT *peo){ int ii; peo->psp = gp_setup_param; peo->db_nrec.conti = 0; for(ii=0; ii < MAX_CH_NUM; ii++) peo->db_nrec.conti |= peo->psp->enc_ch[ii].flag_conti_rec; /* sub db update */ if(sub_db_update(peo)) /* main db update */ main_db_update(peo); /* clear event flag */ peo->db_nrec.conti = 0; peo->db_nrec.motion = 0; peo->db_nrec.sensor = 0; return SUCCESS;}/* update and sorting for sub db */RETURN sub_db_update(ENC_OBJECT *peo){ FILE *fp; UNS32 cur_fp; UNS8 db_name[32]; DB_RECORD dr; S32 ret, record_cnt; extern S32 errno; STATE_DB *psdb; psdb = &gp_state_thread->state_db; /* directory name copy */ strcpy(db_name, peo->dname_ps); strcat(db_name, SUB_DB_NAME); /* LOCK "SUB DB" file */ sem_wait(&psdb->search_sem); fp = fopen(db_name, "r+b"); if (fp == NULL) { if (errno == ENOENT) { /* file does not exist */ if (!(fp = fopen(db_name, "wb"))) { m_ERROR("pthread_enc.c:error In function 'fopen'\n"); /* UNLOCK "SUB DB" file */ sem_post(&psdb->search_sem); return FAILURE; } else { fclose(fp); fp = fopen(db_name, "r+b"); } } else { m_ERROR("pthread_enc.c:error In function 'fopen'\n"); /* UNLOCK "SUB DB" file */ sem_post(&psdb->search_sem); return FAILURE; } } fseek(fp, 0, SEEK_END); cur_fp = ftell(fp); /* set for last record pointer */ fseek(fp, -sizeof(DB_RECORD), SEEK_END); /* time diff compare */ if (fread(&dr, sizeof(S8), sizeof(DB_RECORD), fp) > 0) { ret = strcmp(peo->fname_ps+6, dr.fname); if(ret < 0) { /* The hour when it is stored last is big */ fclose(fp); /* UNLOCK "SUB DB" file */ sem_post(&psdb->search_sem); if(recreate_sub_db(peo)) /* soting and recreation sub db */ return SUCCESS; else return FAILURE; } else if (ret == 0) { /* only last record update */ fseek(fp, -sizeof(DB_RECORD), SEEK_END); cur_fp = ftell(fp); } } if (cur_fp) peo->db_nrec.prev_db_fp = cur_fp - sizeof(DB_RECORD); else peo->db_nrec.prev_db_fp = cur_fp; peo->db_nrec.next_db_fp = cur_fp + sizeof(DB_RECORD); memset(peo->db_nrec.fname, 0x00, sizeof(peo->db_nrec.fname)); strcpy(peo->db_nrec.fname, peo->fname_ps+6); #ifndef LOOPTHROUGH_MODE fwrite(&peo->db_nrec, sizeof(DB_RECORD), sizeof(UNS8), fp);#endif fclose(fp); /* UNLOCK "SUB DB" file */ sem_post(&psdb->search_sem); return SUCCESS;}/* update and sorting for main db */RETURN main_db_update(ENC_OBJECT *peo){ FILE *fp; UNS32 cur_fp; UNS8 db_name[32]; DB_RECORD dr; S32 i, ret, record_cnt; BOOL time_diff_flag=FALSE; extern S32 errno; STATE_DB *psdb; psdb = &gp_state_thread->state_db; /* LOCK "MAIN DB" file */ sem_wait(&psdb->search_sem); fp = fopen(MAIN_DB_NAME, "r+b"); if (fp == NULL) { if (errno == ENOENT) { /* file does not exist */ if (!(fp = fopen(MAIN_DB_NAME, "wb"))) { m_ERROR("pthread_enc.c:error In function 'fopen'\n"); /* UNLOCK "MAIN DB" file */ sem_post(&psdb->search_sem); return FAILURE; } else { fclose(fp); fp = fopen(MAIN_DB_NAME, "r+b"); } } else { m_ERROR("pthread_enc.c:error In function 'fopen'\n"); /* UNLOCK "MAIN DB" file */ sem_post(&psdb->search_sem); return FAILURE; } } fseek(fp, 0, SEEK_END); cur_fp = ftell(fp); /* set for last record pointer */ fseek(fp, -sizeof(DB_RECORD), SEEK_END); /* time diff compare */ if (fread(&dr, sizeof(S8), sizeof(DB_RECORD), fp) > 0) { ret = strcmp(peo->fname_ps+6, dr.fname+6); if(ret < 0) { /* The hour when it is stored last is big */ time_diff_flag = TRUE; /* !! time diff : sub db update for all record */ } else if(ret == 0) { ret = strcmp(peo->fname_ps, dr.fname); if(ret < 0) time_diff_flag = TRUE; else if (ret == 0) { /* only last record update */ fseek(fp, -sizeof(DB_RECORD), SEEK_END); cur_fp = ftell(fp); } } } if(!time_diff_flag) { if (cur_fp) peo->db_nrec.prev_db_fp = cur_fp - sizeof(DB_RECORD); else peo->db_nrec.prev_db_fp = cur_fp; peo->db_nrec.next_db_fp = cur_fp + sizeof(DB_RECORD); memset(peo->db_nrec.fname, 0x00, sizeof(peo->db_nrec.fname)); strcpy(peo->db_nrec.fname, peo->fname_ps); #ifndef LOOPTHROUGH_MODE fwrite(&peo->db_nrec, sizeof(DB_RECORD), sizeof(UNS8), fp);#endif fclose(fp); /* UNLOCK "MAIN DB" file */ sem_post(&psdb->search_sem); } else { fclose(fp); /* UNLOCK "MAIN DB" file */ sem_post(&psdb->search_sem); record_cnt = db_record_count(); /* soting and recreation main db */ if(record_cnt) recreate_main_db(record_cnt); } return SUCCESS;}/* soting and recreation sub db */RETURN recreate_sub_db(ENC_OBJECT *peo){ FILE *fp_subdb, *fp_tempdb; UNS32 cur_fp; UNS8 sub_db_name[32], temp_db_name[32]; DB_RECORD dr, dr_t; S32 ret, record_cnt=0; BOOL insert_flag = TRUE, change_flag = TRUE; STATE_DB *psdb; psdb = &gp_state_thread->state_db; /* directory name copy */ strcpy(sub_db_name, peo->dname_ps); strcat(sub_db_name, SUB_DB_NAME); /* LOCK "SUB DB" file */ sem_wait(&psdb->search_sem); if ((fp_subdb = fopen(sub_db_name, "rb")) == NULL) { m_ERROR("pthread_enc.c:error In function 'fopen'\n"); return FAILURE; } /* for rename fun() */ TEMP_SEARCH_DB(&temp_db_name, (peo->dname_ps[4]-'a')); if ((fp_tempdb = fopen(temp_db_name, "wb")) == NULL) { m_ERROR("pthread_enc.c:error In function 'fopen'\n"); return FAILURE; } /* get sub db struct Info*/ while(fread(&dr, sizeof(S8), sizeof(DB_RECORD), fp_subdb) > 0) { cur_fp = ftell(fp_subdb); memcpy(&dr_t, &dr, sizeof(DB_RECORD)); /* file name compare */ ret = strcmp(peo->fname_ps+6, dr.fname); if (ret == 0) { /* only the record where the filename is same the update */ memcpy(&dr_t, &peo->db_nrec, sizeof(DB_RECORD)); dr_t.prev_db_fp = dr.prev_db_fp; dr_t.next_db_fp = dr.next_db_fp; strcpy(dr_t.fname, peo->fname_ps+6); insert_flag = FALSE; change_flag = FALSE; } else if( ret < 0) { if(insert_flag) { /* new record insertion */ memcpy(&dr_t, &peo->db_nrec, sizeof(DB_RECORD)); dr_t.prev_db_fp = dr.prev_db_fp; dr_t.next_db_fp = dr.next_db_fp; strcpy(dr_t.fname, peo->fname_ps+6); #ifndef LOOPTHROUGH_MODE fwrite(&dr_t, sizeof(DB_RECORD), sizeof(S8), fp_tempdb);#endif insert_flag = FALSE; } if(change_flag) { /* record pointer update */ memcpy(&dr_t, &dr, sizeof(DB_RECORD)); if(cur_fp <= sizeof(DB_RECORD)) dr_t.prev_db_fp = 0; else dr_t.prev_db_fp += sizeof(DB_RECORD); dr_t.next_db_fp += sizeof(DB_RECORD); } }#ifndef LOOPTHROUGH_MODE fwrite(&dr_t, sizeof(DB_RECORD), sizeof(S8), fp_tempdb);#endif } fclose(fp_subdb); fclose(fp_tempdb); /* replace file name */ if (rename(temp_db_name, sub_db_name) == -1) { m_ERROR("pthread_enc.c:error In function 'rename'\n"); return FAILURE; } /* UNLOCK "SUB DB" file */ sem_post(&psdb->search_sem); return SUCCESS;}/* end of pthread_enc.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -