⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pthread_enc.c

📁 1、基于韩国at2041芯片开发的Linux环境的DVR代码。 2、以原来代码进行了修改。 3、主要修改网络通讯出现异常问题处理 4、硬盘覆盖录像不起作用
💻 C
📖 第 1 页 / 共 4 页
字号:
				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 + -