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

📄 pthread_dec.c

📁 1、基于韩国at2041芯片开发的Linux环境的DVR代码。 2、以原来代码进行了修改。 3、主要修改网络通讯出现异常问题处理 4、硬盘覆盖录像不起作用
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (pdo->dip.cur_size > DEC_MAX_BUF_SIZE) {			printf("!!! CUR => [0x%d][0x%d]\n", pdo->dip.cur_size, pdo->tpp.cur_pes_packet_length); fflush(stdout);		}		if ( ((pdo->tpp.start_code & 0x000000f0)) == 0xE0) {		pdo->dip.data_type = DT_VIDEO;	} else if ( ((pdo->tpp.start_code & 0x000000f0)) == 0xC0) {		pdo->dip.data_type = DT_AUDIO;	}	pdo->dip.type = (pdo->tpp.cur_pes_packet_length & 0x00000003);	if (pdo->tpp.cur_pes_packet_length & 0x00000080) {		pdo->dip.conti = 1;	} else {		pdo->dip.conti = 0;	}	if (pdo->tpp.cur_pes_packet_length & 0x00000008 ) {		pdo->dip.motion = 1;	} else {		pdo->dip.motion = 0;	}	if (pdo->tpp.cur_pes_packet_length & 0x00000004 ) {		pdo->dip.motion_start = 1;	} else {		pdo->dip.motion_start = 0;	}	if (pdo->tpp.cur_pes_packet_length & 0x00000040) {		pdo->dip.sensor = 1;	} else {		pdo->dip.sensor = 0;	}	if (pdo->tpp.cur_pes_packet_length & 0x00000020) {		pdo->dip.sensor_start = 1;	} else {		pdo->dip.sensor_start = 0;	}	 	/* 2nd. check file stream ending */	if ( ftell(pdo->p_fd_ps) - pdo->dip.prev_size <= PACK_HEADER_SIZE + PROGRAM_STREAM_MAP_SIZE + PES_PACKET_SIZE ) 	{		return F_END;	}	return F_CONTI;}BOOL decoding_stream_filter(DEC_OBJECT *pdo){	STATE_DEC	*psd;		psd = &gp_state_thread->state_dec;	if (psd->mode_rec == ALL) {			// '0' All		return TRUE;				} else if (psd->mode_rec == CONTI) {	// '1' Conti		if (pdo->dip.conti) {			return TRUE;					}	} else if (psd->mode_rec == MOTION) {	// '2' Motion		if (pdo->dip.motion) {			return TRUE;					}	} else if (psd->mode_rec == SENSOR) {	// '3' Sensor		if (pdo->dip.sensor) {			return TRUE;					}	}	return FALSE;}RETURN read_data_from_hdd(DEC_OBJECT *pdo){	size_t size;		if (pdo->dip.cur_size > DEC_MAX_BUF_SIZE) {		printf("\t!!! [0x%x]:[0x%x] !!!\n", size, pdo->dip.cur_size); fflush(stdout);		return FAILURE;}	size = fread(pdo->p_demux_buf, sizeof(UNS8), pdo->dip.cur_size, pdo->p_fd_ps); fflush(pdo->p_fd_ps);	if (size != pdo->dip.cur_size) {		m_ERROR("pthread_dec.c:error In function 'fread'\n");		return FAILURE;	}		pdo->p_demux_buf[pdo->dip.cur_size/2+1] = ((pdo->play_mode & 0xff) << 2) | 0x01;	// force to last flag 1	return SUCCESS;}RETURN feed_data_to_decoder(DEC_OBJECT *pdo){	UNS16	exit_play;	UNS32   size, cur_size;	exit_play = 0;	/* xchannel-20050510@add-bug fix: when the split frame, processing */      cur_size = pdo->dip.cur_size;	do {		if (cur_size > DEC_MAX_BUF_SIZE) {					/* 1st. read one frame hard disk */						size = fread(pdo->p_demux_buf, sizeof(UNS8), DEC_MAX_BUF_SIZE, pdo->p_fd_ps); fflush(pdo->p_fd_ps);			if (size != DEC_MAX_BUF_SIZE) {				m_ERROR("pthread_dec.c:error In function 'fread'\n");				return FAILURE;			}				pdo->p_demux_buf[DEC_MAX_BUF_SIZE/2+1] = ((pdo->play_mode & 0xff) << 2) | 0x00;	// force to continue flag 0			/* 2nd. write to driver buffer */					decoding_stream_write(pdo->p_demux_buf, DEC_MAX_BUF_SIZE + RX_BUF_SIZE * 2);				cur_size -= DEC_MAX_BUF_SIZE;			} else {			/* 1st. read one frame hard disk */					size = fread(pdo->p_demux_buf, sizeof(UNS8), cur_size, pdo->p_fd_ps); fflush(pdo->p_fd_ps);			if (size != cur_size) {				m_ERROR("pthread_dec.c:error In function 'fread'\n");				return FAILURE;			}				pdo->p_demux_buf[cur_size/2+1] = ((pdo->play_mode & 0xff) << 2) | 0x01;	// force to last flag 1			/* 2nd. write to driver buffer */			decoding_stream_write(pdo->p_demux_buf, cur_size + RX_BUF_SIZE * 2);				exit_play = 1;		}	} while (!exit_play);	return SUCCESS;}RETURN get_picture_inform(DEC_OBJECT *pdo){	size_t size;	/* 1st. read program stream map from file stream */	size = fread(&pdo->tpp, sizeof(S8), sizeof(PES_PACKET), pdo->p_fd_ps); fflush(pdo->p_fd_ps);	if (size != sizeof(PES_PACKET)) {		m_ERROR("pthread_dec.c:error In function 'fread'\n");		return FAILURE;	}			/* 2nd. return search file pointer to start picture */	fseek(pdo->p_fd_ps, ~ sizeof(PES_PACKET) + 1, SEEK_CUR);		return SUCCESS;}BOOL fast_forward_stream_filter(DEC_OBJECT *pdo){	STATE_DEC	*psd;		psd = &gp_state_thread->state_dec;	/* filterring for data type */	if (pdo->dip.data_type == DT_AUDIO) {		return FALSE;	}	/* filterring Picture for type */#if 1		if (psd->play_step >= 1) {			// x 2			if (pdo->dip.type == P_PICTURE) {			return FALSE;		} else if (pdo->dip.type == B_PICTURE) {			return FALSE;		}	}#else		if (psd->play_step == 1) {			// x 2			if (pdo->dip.type == B_PICTURE) {			return FALSE;		}	} else if (psd->play_step >= 2) {	// x 4		if (pdo->dip.type == P_PICTURE) {			return FALSE;		} else if (pdo->dip.type == B_PICTURE) {			return FALSE;		}	}#endif			/* filterring Picture for decoding mode */	if (psd->mode_rec == ALL) {				// '0' All		return TRUE;				} else if (psd->mode_rec == CONTI) {	// '1' Conti		if (pdo->dip.conti) {			return TRUE;					}	} else if (psd->mode_rec == MOTION) {	// '2' Motion		if (pdo->dip.motion) {			return TRUE;					}	} else if (psd->mode_rec == SENSOR) {	// '3' Sensor		if (pdo->dip.sensor) {			return TRUE;					}	}	return FALSE;}BOOL fast_backward_stream_filter(DEC_OBJECT *pdo){	STATE_DEC	*psd;		psd = &gp_state_thread->state_dec;	/* filterring for data type */	if (pdo->dip.data_type == DT_AUDIO) {		return FALSE;	}	/* filterring Picture for type */	if (psd->play_step >= 1) {			// x 2			if (pdo->dip.type == P_PICTURE) {			return FALSE;		} else if (pdo->dip.type == B_PICTURE) {			return FALSE;		}	}	/* filterring Picture for decoding mode */	if (psd->mode_rec == ALL) {				// '0' All		return TRUE;				} else if (psd->mode_rec == CONTI) {	// '1' Conti		if (pdo->dip.conti) {			return TRUE;					}	} else if (psd->mode_rec == MOTION) {	// '2' Motion		if (pdo->dip.motion) {			return TRUE;					}	} else if (psd->mode_rec == SENSOR) {	// '3' Sensor		if (pdo->dip.sensor) {			return TRUE;					}	}	return FALSE;}RETURN select_next_file(DEC_OBJECT *pdo){	S32		pt_cur;	S32		pt_end;		S8		str_tmp[40];		FILE	*fd;	size_t	size;			STATE_DEC	*psd;	STATE_DB	*psdb;    DB_RECORD db_t;    	S32          record_idx, ret;    PTHREAD_BUF		signal;		psd = &gp_state_thread->state_dec;	psdb = &gp_state_thread->state_db;	/* 1st. play file close */	fclose(pdo->p_fd_ps); 		/* LOCK "MAIN_DB" file */	sem_wait(&psdb->search_sem);	/* 2nd. open DB file */	if ( !(fd = fopen(MAIN_DB_NAME, "rb")) ) {		m_ERROR("pthread_dec.c:error In function 'fopen'\n");		/* UNLOCK "MAIN_DB" file */		sem_post(&psdb->search_sem);		return FAILURE;	}	    record_idx = pdo->db_rec.next_db_fp / sizeof(DB_RECORD) - 1;    /* When the storage space will be the full and db info is exchanged, corresponding record re-search */    while(1) {		fseek(fd, sizeof(DB_RECORD) * record_idx, SEEK_SET);    		ret= fread(&db_t, sizeof(S8), sizeof(DB_RECORD), fd);	    	if(ret < 0) {		    	m_ERROR("#pthread_dec.c:error In function 'fread'\n");		    	fclose(fd);		    	/* UNLOCK "MAIN_DB" file */			sem_post(&psdb->search_sem);			return FAILURE;	    	} else if ( ret == 0) {			fclose(fd);			/* UNLOCK "MAIN_DB" file */			sem_post(&psdb->search_sem);			return ENDING;	    	}		if(strcmp(pdo->db_rec.fname, db_t.fname) < 0) 			record_idx--;		else {			record_idx++;			break;		}	    if (record_idx < 0) {			record_idx = 0;			break;	    }    }	/* 4rd. move DB file pointer to present play file */	fseek(fd, sizeof(DB_RECORD) * record_idx, SEEK_SET);    	pt_cur = ftell(fd);	/* 4th. get main DB info */	fread(&pdo->db_rec, sizeof(UNS8), sizeof(DB_RECORD), fd);	/* 5th. check search file end */	fseek(fd, 0, SEEK_END);	pt_end = ftell(fd);	m_DEBUG("\t!!! [cur>%#08x::end>%#08x]\n", pt_cur, pt_end);		if (pt_cur >= pt_end) {		/* 6th. close DB file */		fclose(fd);		/* UNLOCK "MAIN_DB" file */		sem_post(&psdb->search_sem);		return ENDING;	}			/* 6th. close DB file */	fclose(fd);		/* UNLOCK "MAIN_DB" file */	sem_post(&psdb->search_sem);	/* 7th. open play file stream */	if ( (pdo->p_fd_ps = fopen(pdo->db_rec.fname, "rb")) < 0 ) {		m_ERROR("pthread_dec.c:error In function 'open'\n");		return FAILURE;			}	m_MSG("\t!!! OPEN: %s !!!\n", pdo->db_rec.fname);    	/* display to file name */    	strcpy(psd->play_file, pdo->db_rec.fname);	/* 8th. searching file end pointer */	fseek(pdo->p_fd_ps, 0, SEEK_END);	pdo->end_fp = ftell(pdo->p_fd_ps);	/* 9th. restore file pointer */	fseek(pdo->p_fd_ps, 0, SEEK_SET);		/* 10th. read pack header from file stream */	size = fread(&pdo->tph, sizeof(S8), sizeof(PACK_HEADER), pdo->p_fd_ps); fflush(pdo->p_fd_ps);		if (size != sizeof(PACK_HEADER)) {           		m_ERROR("pthread_dec.c:error In function 'fread'\n");		return FAILURE;	}		/* 11th. read program stream map from file stream */	size = fread(&pdo->tpsm, sizeof(S8), sizeof(PROGRAM_STREAM_MAP), pdo->p_fd_ps); fflush(pdo->p_fd_ps);		if (size != sizeof(PROGRAM_STREAM_MAP)) {		m_ERROR("pthread_dec.c:error In function 'fread'\n");		return FAILURE;	}	/* 12th. read PES packet from file stream */ 	size = fread(&pdo->tpp, sizeof(S8), sizeof(PES_PACKET), pdo->p_fd_ps); fflush(pdo->p_fd_ps);			if (size != sizeof(PES_PACKET)) {		m_ERROR("pthread_dec.c:error In function 'fread'\n");		return FAILURE;	}		/* 13th. search file pointer of start picture */	fseek(pdo->p_fd_ps, ~ sizeof(PES_PACKET) + 1, SEEK_CUR);	/* 14th. signal send for auto view mode change */	signal.start_id = PTHREAD_DEC;	signal.m_value = 3;		if(pdo->db_rec.fname[24] == 'm')		signal.m_channel = 4;	else#if 1//big endian						signal.m_channel = pdo->tpp.start_code & 0x0f;		#else//little endian		signal.m_channel = pdo->tpp.start_code & 0x0f;		#endif	if (pthread_send_signal(&signal, PTHREAD_LIVE) == FALSE) {		m_ERROR("main.c:error: In function 'pthread_send_signal'\n");	}				return SUCCESS;}RETURN select_previous_file(DEC_OBJECT *pdo){	S8		str_tmp[40];		FILE	*fd;	size_t	size;			STATE_DEC	*psd;	STATE_DB	*psdb;    DB_RECORD db_t;    	S32          record_idx, ret;    PTHREAD_BUF		signal;		psd = &gp_state_thread->state_dec;	psdb = &gp_state_thread->state_db;	/* 1st. play file close */	fclose(pdo->p_fd_ps); 		/* 2nd. check backward playback end */	if (pdo->flag_global) {				pdo->flag_global = 0;		return ENDING;			}		/* LOCK "MAIN_DB" file */	sem_wait(&psdb->search_sem);	/* 3rd. open DB file */	if ( !(fd = fopen(MAIN_DB_NAME, "rb")) ) {		m_ERROR("pthread_dec.c:error In function 'fopen'\n");		/* UNLOCK "MAIN_DB" file */		sem_post(&psdb->search_sem);		return FAILURE;	}		/* When the storage space will be the full and db info is exchanged, corresponding record re-search */    record_idx = pdo->db_rec.next_db_fp / sizeof(DB_RECORD) - 1;      while(1) {		fseek(fd, sizeof(DB_RECORD) * record_idx, SEEK_SET);    		ret = fread(&db_t, sizeof(S8), sizeof(DB_RECORD), fd);			    	if( ret < 0) {		    	m_ERROR("##pthread_dec.c:error In function 'fread'\n");		    	fclose(fd);		    	/* UNLOCK "MAIN_DB" file */			sem_post(&psdb->search_sem);			return FAILURE;	    	} else if ( ret == 0) {			fclose(fd);			/* UNLOCK "MAIN_DB" file */			sem_post(&psdb->search_sem);			return ENDING;	    }		if(strcmp(pdo->db_rec.fname, db_t.fname) <=  0)  			record_idx--;		else 			break;	    if (record_idx < 0) {			pdo->flag_global = 1;			fclose(fd);			/* UNLOCK "MAIN_DB" file */			sem_post(&psdb->search_sem);			return ENDING;	    }    }	/* 4rd. move DB file pointer to present play file */	fseek(fd, sizeof(DB_RECORD) * record_idx, SEEK_SET);    	/* 5th. get DB info */	fread(&pdo->db_rec, sizeof(UNS8), sizeof(DB_RECORD), fd);	/* 6th. check search file start */		if (pdo->db_rec.next_db_fp == sizeof(DB_RECORD)) {		pdo->flag_global = 1;	}			/* 7th. close DB file */	fclose(fd);			/* UNLOCK "MAIN_DB" file */	sem_post(&psdb->search_sem);	/* 8th. open play file stream */	if ( (pdo->p_fd_ps = fopen(pdo->db_rec.fname, "rb")) < 0 ) {		m_ERROR("pthread_dec.c:error In function 'open'\n");		return FAILURE;			}	m_MSG("\t!!! OPEN: %s !!!\n", pdo->db_rec.fname);      /* display to file name */      strcpy(psd->play_file, pdo->db_rec.fname);	/* 9th. searching file end pointer */	fseek(pdo->p_fd_ps, 0, SEEK_END);	pdo->end_fp = ftell(pdo->p_fd_ps);	/* 10th. restore file pointer */	fseek(pdo->p_fd_ps, 0, SEEK_SET);		/* 11th. move stream file pointer to present picture */	fseek(pdo->p_fd_ps, pdo->db_rec.end_fp, SEEK_SET);		/* 12th. read PES packet from file stream */	size = fread(&pdo->tpp, sizeof(S8), sizeof(PES_PACKET), pdo->p_fd_ps); fflush(pdo->p_fd_ps);			if (size != sizeof(PES_PACKET)) {		m_ERROR("pthread_dec.c:error In function 'fread'\n");		return FAILURE;	}		/* 13th. search file pointer of start picture */	fseek(pdo->p_fd_ps, ~ sizeof(PES_PACKET) + 1, SEEK_CUR);	/* 14th. signal send for auto view mode change */	signal.start_id = PTHREAD_DEC;	signal.m_value = 3;		if(pdo->db_rec.fname[24] == 'm')		signal.m_channel = 4;	else#if 1//big endian						signal.m_channel = pdo->tpp.start_code & 0x0f;		#else//little endian		signal.m_channel = pdo->tpp.start_code & 0x0f;		#endif	if (pthread_send_signal(&signal, PTHREAD_LIVE) == FALSE) {		m_ERROR("main.c:error: In function 'pthread_send_signal'\n");	}				return SUCCESS;}/* end of pthread_dec.c */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -