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

📄 stream_server.c

📁 1、基于韩国at2041芯片开发的Linux环境的DVR代码。 2、以原来代码进行了修改。 3、主要修改网络通讯出现异常问题处理 4、硬盘覆盖录像不起作用
💻 C
📖 第 1 页 / 共 4 页
字号:
		str_h.frame_type = t_short;
#else//org
		str_h.frame_num = stream_str->frame_number;
		str_h.frame_size = stream_str->frame_size;
		str_h.slice_num = seq_nr++;
		str_h.slice_size = MAX_STREAM_SLICE;
		str_h.frame_id = stream_str->frame_id;
		//str_h.frame_id = stream_str->frame_crc;
		str_h.frame_gop = stream_str->frame_gop;
		str_h.frame_gop_num = stream_str->frame_gop_num;
		str_h.frame_type = stream_str->frame_type;
#endif	
		memcpy((unsigned char *)str_h.frame_data , data , MAX_STREAM_SLICE);		
		memcpy((unsigned char *)str_h.end_code, "micro" , sizeof("micro"));
#if 0		
		for (crc_cnt=0;crc_cnt<str_h.slice_size;crc_cnt+=2) {
			crc_checksum += (str_h.frame_data[crc_cnt]+str_h.frame_data[crc_cnt+1]);
		}
		str_h.frame_id = crc_checksum;
#endif
#if 0//xchannel debug
		printf("\nnum=%d, type=%d", stream_str->frame_number, stream_str->frame_type); fflush(stdout);
#endif

		if( (r = write(fd, (struct strhdr *)&str_h, sizeof(struct strhdr))) <= 0 )
		{				
			perror("write");
			pthread_mutex_unlock(&write_slice_mutex);
		  	pthread_cond_signal(&write_slice_cond);
			return(r);			
		}		

#ifdef __SELECT__			
		if ( (s = select(fd+1, NULL, &ww_set, NULL, &wtimeout)) < 0 ) {
			perror("select");
	  		pthread_mutex_unlock(&write_slice_mutex);
	  		pthread_cond_signal(&write_slice_cond);
			return(s);
		}
		if (FD_ISSET(fd, &ww_set)) { 
			FD_CLR(fd, &ww_set); 
		}
		else {			
			pthread_mutex_unlock(&write_slice_mutex);
	  		pthread_cond_signal(&write_slice_cond);
			return(s);				
		}		
#endif

		w += r;
		seq_sz -= MAX_STREAM_SLICE;
		data += MAX_STREAM_SLICE;
		
		usleep(1); /*!!!WARNING!!!*/
	}//End of while

#ifdef __SELECT__	
	FD_ZERO(&rr_set);
	FD_SET(fd, &rr_set);	
	FD_ZERO(&ww_set);
	FD_SET(fd, &ww_set);	
#endif	

	//memset((struct strhdr *)&str_h, '\0', sizeof(struct strhdr));	
	memcpy((unsigned char *)str_h.start_code, "penta" , sizeof("penta"));	

#if 1//xchannel modify ( big endian  -> little endian )
	t_long = ((stream_str->frame_number & 0xff0000) >> 8) | ((stream_str->frame_number & 0xff000000) >> 24) 
		   | ((stream_str->frame_number & 0xff00) << 8) | ((stream_str->frame_number & 0xff) << 24);
	str_h.frame_num = t_long;

	t_short = ((stream_str->frame_size & 0xff00) >> 8) | ((stream_str->frame_size & 0xff) << 8);
	str_h.frame_size = t_short;

	t_short = ((seq_nr & 0xff00) >> 8) | ((seq_nr & 0xff) << 8);
	str_h.slice_num = t_short;
	seq_nr++;

	t_short = ((seq_sz & 0xff00) >> 8) | ((seq_sz & 0xff) << 8);
	str_h.slice_size = t_short;

	t_short = ((stream_str->frame_id & 0xff00) >> 8) | ((stream_str->frame_id & 0xff) << 8);
	str_h.frame_id = t_short;
		
	//str_h.frame_id = stream_str->frame_crc;

	t_long = ((stream_str->frame_gop & 0xff0000) >> 8) | ((stream_str->frame_gop & 0xff000000) >> 24) 
		   | ((stream_str->frame_gop & 0xff00) << 8) | ((stream_str->frame_gop & 0xff) << 24);
	str_h.frame_gop = t_long;

	t_short = ((stream_str->frame_gop_num & 0xff00) >> 8) | ((stream_str->frame_gop_num & 0xff) << 8);
	str_h.frame_gop_num = t_short;
		

	t_short = ((stream_str->frame_type & 0xff00) >> 8) | ((stream_str->frame_type & 0xff) << 8);
	str_h.frame_type = t_short;
#else//org 
	str_h.frame_num = stream_str->frame_number;
	str_h.frame_size = stream_str->frame_size;
	str_h.slice_num = seq_nr++;
	str_h.slice_size = seq_sz;
	str_h.frame_id = stream_str->frame_id;
	//str_h.frame_id = stream_str->frame_crc;
	str_h.frame_gop = stream_str->frame_gop;
	str_h.frame_gop_num = stream_str->frame_gop_num;
	str_h.frame_type = stream_str->frame_type;
#endif	
	memcpy((unsigned char *)str_h.frame_data , data , seq_sz);	
	memcpy((unsigned char *)str_h.end_code, "micro" , sizeof("micro"));
	//memcpy ((unsigned char *)str_h.frame_data+seq_sz, "A" , MAX_STREAM_SLICE-seq_sz);
#if 0	
	for (crc_cnt=0;crc_cnt<str_h.slice_size;crc_cnt+=2) {
		crc_checksum += (str_h.frame_data[crc_cnt]+str_h.frame_data[crc_cnt+1]);
	}
	str_h.frame_id = crc_checksum;
#endif		
#if 0//xchannel debug
	printf("\nnum=%d, type=%d", stream_str->frame_number, stream_str->frame_type); fflush(stdout);
#endif
	if( (r = write(fd, (struct strhdr *)&str_h, sizeof(struct strhdr))) <= 0 )
	{
		perror("write");
	  	pthread_mutex_unlock(&write_slice_mutex);
	  	pthread_cond_signal(&write_slice_cond);
		return(r);
	}	

#ifdef __SELECT__			
	if( (s = select(fd+1, NULL, &ww_set, NULL, &wtimeout)) < 0 ) {
		perror("select");
	  	pthread_mutex_unlock(&write_slice_mutex);
	  	pthread_cond_signal(&write_slice_cond);
		return(s);
	}
	if (FD_ISSET(fd, &ww_set)) { 
		FD_CLR(fd, &ww_set); 
	}
	else {			
		pthread_mutex_unlock(&write_slice_mutex);
  		pthread_cond_signal(&write_slice_cond);
		return(s);			
	}			
#endif

	w += r;

	pthread_mutex_unlock(&write_slice_mutex);
  	pthread_cond_signal(&write_slice_cond);

	return(w);

}//end of write_slice

static void Get_Current_Time(char *time_str)
{
	time_t tm_stream;
	struct tm tm_time_stream;
	char str_stream[8];
	 
	time(&tm_stream);
	memcpy(&tm_time_stream, localtime(&tm_stream), sizeof(tm_time_stream));	
	 
	sprintf(str_stream, "%04d",tm_time_stream.tm_year+1900);strcpy(time_str,str_stream);
	sprintf(str_stream, "%02d",tm_time_stream.tm_mon+1);strcat(time_str,str_stream);
	sprintf(str_stream, "%02d",tm_time_stream.tm_mday);strcat(time_str,str_stream);
	sprintf(str_stream, "%02d",tm_time_stream.tm_hour);strcat(time_str,str_stream);
	sprintf(str_stream, "%02d",tm_time_stream.tm_min);strcat(time_str,str_stream);
	sprintf(str_stream, "%02d",tm_time_stream.tm_sec);strcat(time_str,str_stream);
}

static 
void *client_loop0(void *args)//Client Thread
{
	int client_sock;
	int client_perm;
	int p_value = -1;	

	unsigned char *send_buff_ipb[MAX_FRAME_IPB];

	int ch_id;
	int sav_cnt=0;
	int snd_cnt=0;
	int mem_cnt=0;
	
	int GOP_STR_NUM=5;

	int stop_flag = 0;

	int write_slice_bytes=0;

	STRDATA str_data_tmp;
	STRDATA str_data_cur;
	STRDATA str_data_sav;
	STRDATA str_data_snd;

	unsigned short frame_on_off;	
	
	_streamparams_* str_params = (struct streamparams*)args ;

	unsigned short send_buff_clear_flag=0;

	int SEND_P_FLAG=0;
	int SEND_B_FLAG=0;

	struct 	timeval m1_timeout;	
	struct 	timeval m2_timeout;	
	struct 	timeval s1_timeout;	
	struct 	timeval s2_timeout;	
	struct	timezone rok_zone;

	long double MEM_TIME=0;	
	long double SND_TIME=0;
	long double NET_TIME=0;
	long double NET_RATE=0;
	
	long NET_BYTE=0;
	long NET_GOP=0;
	long SAV_I_BYTE=0;	
	long SAV_P_BYTE=0;	
	long SAV_B_BYTE=0;	
	
	unsigned long JUMPED_GOP=0;

	int log_val = -1;
	int read_byte;
	_loginfo_ log_info ; 

	unsigned long tmp_number=0;		
	unsigned long tmp_gop=0;				
	
#ifdef __SELECT__
	fd_set rr_set, ww_set ;
	struct  timeval rtimeout;	
	struct  timeval wtimeout;	

	rtimeout.tv_sec = 0L;    
	rtimeout.tv_usec = 1000L;

	wtimeout.tv_sec = 100L;    
	wtimeout.tv_usec = 1000L;
#endif

	client_sock = str_params->client_sock;
	ch_id = str_params->client_addr;		//channel_id//

#ifndef __DETACH_THREAD__
	if( pthread_detach(pthread_self()) != 0) perror("pthread_detatch");
	else {
		DEV_LEVEL0 ("[Client Thread ID %d:%d STARTED]\n", ch_id, client_sock);	 
	}
#endif      

#if 0
	if ( (read_byte = read (client_sock, &log_info, sizeof(struct loginfo))) < 1) {
		close(client_sock);
		pthread_exit((void*)p_value);
	}
	else if( read_byte > 0) {
		if( (log_val = stream_certify(ch_id, log_info) ) == -1) {
			close(client_sock);
			DEV_LEVEL2("\nAccess Deny\n");					
			pthread_exit((void*)p_value);
		}
		else if( log_val == 1) {
			client_perm =  NORMAL_USER;				
			DEV_LEVEL2("\nAccess Level[%d]\n", client_perm);				
		}
		else if( log_val  == 0) {
			client_perm =  SUPER_USER;				
			DEV_LEVEL2("\nAccess Level[%d]\n", client_perm);					
		}
		else {
			close(client_sock);
			DEV_LEVEL2("\nAccess Deny\n");					
			pthread_exit((void*)p_value);
		}
	}
	DEV_LEVEL2("[STR:%s-%d:%d]\n", str_params->client_ip, str_params->client_port, log_val);
#else
	DEV_LEVEL0 ("[STR:%s-%d]\n", str_params->client_ip, str_params->client_port);
#endif

#if 0
#define system_log_file "/hdda/net_service.log"
	{
		FILE *fp_stream; char log_strings[30] = "\0";
		if( (fp_stream = fopen(system_log_file, "a")) == NULL ) perror("fopen");
		Get_Current_Time(log_strings); fwrite(log_strings, 14 , 1, fp_stream);
		sprintf(log_strings, "STR:%s:%d-%d", str_params->client_ip, str_params->client_port, log_val);				 
		fwrite(log_strings , strlen(log_strings), 1, fp_stream);fwrite("\n", 1 , 1 ,fp_stream);
		fclose(fp_stream);
	}
#endif

#if 0
	if( (client_perm == 0) || (client_perm == 1) )
	{
		frame_on_off=CH_ON;
	}	
	else frame_on_off=CH_OFF;  
#else
	frame_on_off=CH_ON;
#endif

	memset( (STRDATA *)&str_data_tmp, 0, sizeof(STRDATA) );
	memset( (STRDATA *)&str_data_cur, 0, sizeof(STRDATA) );
	memset( (STRDATA *)&str_data_sav, 0, sizeof(STRDATA) );
	memset( (STRDATA *)&str_data_snd, 0, sizeof(STRDATA) );

	for(mem_cnt=0;mem_cnt<MAX_FRAME_IPB;mem_cnt++)
	{
		(unsigned char *)send_buff_ipb[mem_cnt] = (unsigned char *)malloc(BUFFER_LEN);// Buffer for Send to client
		memset(send_buff_ipb[mem_cnt], '\0', BUFFER_LEN);
	}
	
#if 0
	if ( (write_slice_bytes=write_slice(client_sock, (STRDATA *)&str_data_snd, send_buff_ipb[snd_cnt]+sizeof(STRDATA))) <=0 ) {
		DEV_LEVEL2("%d:%d",ch_id, client_sock);
	}
#endif

	while( (!QUIT_STREAM) && !(stop_flag) ) 
	{			
		GOP_STR_NUM=MAX_FRAME_IPB;
		
		if (frame_on_off == CH_ON)
		{
			SAV_I_BYTE=0;
			SAV_P_BYTE=0;
			SAV_B_BYTE=0;
			m1_timeout.tv_sec = 0;
			m1_timeout.tv_usec = 0;
			m2_timeout.tv_sec = 0;
			m2_timeout.tv_usec = 0;	
			
			switch(ch_id)	
			{
				case 0: 	
				{
					for(sav_cnt=0;sav_cnt<GOP_STR_NUM;sav_cnt++) 	
					{		
						while( (!QUIT_STREAM) && !(stop_flag) ) 
						{
#ifdef __SELECT__						
							FD_ZERO(&rr_set);
							FD_SET(client_sock, &rr_set);	
							FD_ZERO(&ww_set);
							FD_SET(client_sock, &ww_set);	
							if (select(client_sock+1, &rr_set, NULL, NULL, &rtimeout) < 0 ) {
								perror("select");
							}
							if (FD_ISSET(client_sock, &rr_set)) { 
								for(mem_cnt=0;mem_cnt<MAX_FRAME_IPB;mem_cnt++) 
									free((unsigned char *)send_buff_ipb[mem_cnt]);
								DEV_LEVEL0 ("[Client Thread ID %d:%d STOPED]\n", ch_id, client_sock);	
								close(client_sock);
								pthread_exit((void*)p_value);	
							}
							else {
								FD_CLR(client_sock, &rr_set); 									
							}
#endif						

							if( memcpy((STRDATA *)&str_data_tmp, ch_buff_0_ipb[sav_cnt], sizeof(STRDATA)) != NULL )
							{
#if 0//xchannel test
printf("\ns: t=%02d", str_data_tmp.frame_type);
fflush(stdout);
#endif							
								if (str_data_tmp.frame_type==0) {
									if( (str_data_tmp.frame_number == INIT_STREAM_NUM) || (tmp_number>=MAX_STREAM_NUM) )  {

⌨️ 快捷键说明

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