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

📄 stream_server.c

📁 1、基于韩国at2041芯片开发的Linux环境的DVR代码。 2、以原来代码进行了修改。 3、主要修改网络通讯出现异常问题处理 4、硬盘覆盖录像不起作用
💻 C
📖 第 1 页 / 共 4 页
字号:
										tmp_number=0;
									}
									tmp_gop = str_data_tmp.frame_gop;
									if( (tmp_number < str_data_tmp.frame_number) ) {
										tmp_number = str_data_tmp.frame_number;
										//memset(send_buff_ipb[sav_cnt], '\0', BUFFER_LEN);
										memcpy(send_buff_ipb[sav_cnt], ch_buff_0_ipb[sav_cnt], str_data_tmp.frame_size+sizeof(STRDATA));
										DEV_LEVEL2 ("sav_cnt:%d , str_data_tmp.frame_number:%d\n" ,sav_cnt, str_data_tmp.frame_number);
										break;
									}
									else usleep(rtimeout.tv_usec);
								}
								else {
									if (tmp_gop == str_data_tmp.frame_gop ) {
										if(tmp_number <  str_data_tmp.frame_number)  {
											tmp_number = str_data_tmp.frame_number;
											//memset(send_buff_ipb[sav_cnt], '\0', BUFFER_LEN);
											memcpy(send_buff_ipb[sav_cnt], ch_buff_0_ipb[sav_cnt], str_data_tmp.frame_size+sizeof(STRDATA));
											DEV_LEVEL2 ("sav_cnt:%d , str_data_tmp.frame_number:%d\n" ,sav_cnt, str_data_tmp.frame_number);
											break;
										}
										else usleep(rtimeout.tv_usec);
									}
									else if (tmp_gop < str_data_tmp.frame_gop ) {
										str_data_tmp.frame_size=0;
										memcpy(send_buff_ipb[sav_cnt], 	(STRDATA *)&str_data_tmp,sizeof(STRDATA));
										break;
									}
									else usleep(rtimeout.tv_usec);
								}
							}														
						}															
						if(str_data_tmp.frame_type==0) SAV_I_BYTE+=str_data_tmp.frame_size;
						if(str_data_tmp.frame_type==1) SAV_P_BYTE+=str_data_tmp.frame_size;
						if(str_data_tmp.frame_type==2) SAV_B_BYTE+=str_data_tmp.frame_size;
						if( sav_cnt == 0 ) {
							m1_timeout.tv_sec = str_data_tmp.tv_sec;
							m1_timeout.tv_usec = str_data_tmp.tv_usec;
						}
						else if( (m2_timeout.tv_sec <= str_data_tmp.tv_sec) || (m2_timeout.tv_usec <= str_data_tmp.tv_usec) ) {
							m2_timeout.tv_sec = str_data_tmp.tv_sec;
							m2_timeout.tv_usec = str_data_tmp.tv_usec;
						}	
						
						GOP_STR_NUM=str_data_tmp.frame_nm;
					}					
					MEM_TIME=1000000*(m2_timeout.tv_sec-m1_timeout.tv_sec)+(m2_timeout.tv_usec-m1_timeout.tv_usec);									
					break;
				}
				
				case 1:
				{
 					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_1_ipb[sav_cnt], sizeof(STRDATA)) != NULL )							
							{
								if (str_data_tmp.frame_type==0) {
									if( (str_data_tmp.frame_number == INIT_STREAM_NUM) || (tmp_number>=MAX_STREAM_NUM) )  {
										tmp_number=0;
									}
									tmp_gop = str_data_tmp.frame_gop;
									if( (tmp_number < str_data_tmp.frame_number) ) {
										tmp_number = str_data_tmp.frame_number;
										//memset(send_buff_ipb[sav_cnt], '\0', BUFFER_LEN);
										memcpy(send_buff_ipb[sav_cnt], ch_buff_1_ipb[sav_cnt], str_data_tmp.frame_size+sizeof(STRDATA));
										DEV_LEVEL2 ("sav_cnt:%d , str_data_tmp.frame_number:%d\n" ,sav_cnt, str_data_tmp.frame_number);
										break;
									}
									else usleep(rtimeout.tv_usec);
								}
								else {
									if (tmp_gop == str_data_tmp.frame_gop ) {
										if(tmp_number <  str_data_tmp.frame_number)  {
											tmp_number = str_data_tmp.frame_number;
											//memset(send_buff_ipb[sav_cnt], '\0', BUFFER_LEN);
											memcpy(send_buff_ipb[sav_cnt], ch_buff_1_ipb[sav_cnt], str_data_tmp.frame_size+sizeof(STRDATA));
											DEV_LEVEL2 ("sav_cnt:%d , str_data_tmp.frame_number:%d\n" ,sav_cnt, str_data_tmp.frame_number);
											break;
										}
										else usleep(rtimeout.tv_usec);
									}
									else if (tmp_gop < str_data_tmp.frame_gop ) {
										str_data_tmp.frame_size=0;
										memcpy(send_buff_ipb[sav_cnt], 	(STRDATA *)&str_data_tmp,sizeof(STRDATA));
										break;
									}
									else usleep(rtimeout.tv_usec);
								}
							}														
						}															
						if(str_data_tmp.frame_type==0) SAV_I_BYTE+=str_data_tmp.frame_size;
						if(str_data_tmp.frame_type==1) SAV_P_BYTE+=str_data_tmp.frame_size;
						if(str_data_tmp.frame_type==2) SAV_B_BYTE+=str_data_tmp.frame_size;
						if( sav_cnt == 0 ){
							m1_timeout.tv_sec = str_data_tmp.tv_sec;
							m1_timeout.tv_usec = str_data_tmp.tv_usec;
						}
						else if( (m2_timeout.tv_sec <= str_data_tmp.tv_sec) || (m2_timeout.tv_usec <= str_data_tmp.tv_usec) ){
							m2_timeout.tv_sec = str_data_tmp.tv_sec;
							m2_timeout.tv_usec = str_data_tmp.tv_usec;
						}
						GOP_STR_NUM=str_data_tmp.frame_nm;
					}
					MEM_TIME=1000000*(m2_timeout.tv_sec-m1_timeout.tv_sec)+(m2_timeout.tv_usec-m1_timeout.tv_usec);										
					break;
				}

				case 2:
				{
 					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_2_ipb[sav_cnt], sizeof(STRDATA)) != NULL )							
							{
								if (str_data_tmp.frame_type==0) {
									if( (str_data_tmp.frame_number == INIT_STREAM_NUM) || (tmp_number>=MAX_STREAM_NUM) )  {
										tmp_number=0;
									}
									tmp_gop = str_data_tmp.frame_gop;
									if( (tmp_number < str_data_tmp.frame_number) ) {
										tmp_number = str_data_tmp.frame_number;
										//memset(send_buff_ipb[sav_cnt], '\0', BUFFER_LEN);
										memcpy(send_buff_ipb[sav_cnt], ch_buff_2_ipb[sav_cnt], str_data_tmp.frame_size+sizeof(STRDATA));
										DEV_LEVEL2 ("sav_cnt:%d , str_data_tmp.frame_number:%d\n" ,sav_cnt, str_data_tmp.frame_number);
										break;
									}
									else usleep(rtimeout.tv_usec);
								}
								else {
									if (tmp_gop == str_data_tmp.frame_gop ) {
										if(tmp_number <  str_data_tmp.frame_number)  {
											tmp_number = str_data_tmp.frame_number;
											//memset(send_buff_ipb[sav_cnt], '\0', BUFFER_LEN);
											memcpy(send_buff_ipb[sav_cnt], ch_buff_2_ipb[sav_cnt], str_data_tmp.frame_size+sizeof(STRDATA));
											DEV_LEVEL2 ("sav_cnt:%d , str_data_tmp.frame_number:%d\n" ,sav_cnt, str_data_tmp.frame_number);
											break;
										}
										else usleep(rtimeout.tv_usec);
									}
									else if (tmp_gop < str_data_tmp.frame_gop ) {
										str_data_tmp.frame_size=0;
										memcpy(send_buff_ipb[sav_cnt], 	(STRDATA *)&str_data_tmp,sizeof(STRDATA));
										break;
									}
									else usleep(rtimeout.tv_usec);
								}
							}														
						}															
						if(str_data_tmp.frame_type==0) SAV_I_BYTE+=str_data_tmp.frame_size;
						if(str_data_tmp.frame_type==1) SAV_P_BYTE+=str_data_tmp.frame_size;
						if(str_data_tmp.frame_type==2) SAV_B_BYTE+=str_data_tmp.frame_size;
						if( sav_cnt == 0 ){
							m1_timeout.tv_sec = str_data_tmp.tv_sec;
							m1_timeout.tv_usec = str_data_tmp.tv_usec;
						}
						else if( (m2_timeout.tv_sec <= str_data_tmp.tv_sec) || (m2_timeout.tv_usec <= str_data_tmp.tv_usec) ){
							m2_timeout.tv_sec = str_data_tmp.tv_sec;
							m2_timeout.tv_usec = str_data_tmp.tv_usec;
						}
						GOP_STR_NUM=str_data_tmp.frame_nm;
					}
					MEM_TIME=1000000*(m2_timeout.tv_sec-m1_timeout.tv_sec)+(m2_timeout.tv_usec-m1_timeout.tv_usec);										
					break;
				}
				
				case 3:
				{
 					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_3_ipb[sav_cnt], sizeof(STRDATA)) != NULL )							
							{
								if (str_data_tmp.frame_type==0) {
									if( (str_data_tmp.frame_number == INIT_STREAM_NUM) || (tmp_number>=MAX_STREAM_NUM) )  {
										tmp_number=0;
									}
									tmp_gop = str_data_tmp.frame_gop;
									if( (tmp_number < str_data_tmp.frame_number) ) {
										tmp_number = str_data_tmp.frame_number;
										//memset(send_buff_ipb[sav_cnt], '\0', BUFFER_LEN);
										memcpy(send_buff_ipb[sav_cnt], ch_buff_3_ipb[sav_cnt], str_data_tmp.frame_size+sizeof(STRDATA));
										DEV_LEVEL2 ("sav_cnt:%d , str_data_tmp.frame_number:%d\n" ,sav_cnt, str_data_tmp.frame_number);
										break;
									}
									else usleep(rtimeout.tv_usec);
								}
								else {
									if (tmp_gop == str_data_tmp.frame_gop ) {
										if(tmp_number <  str_data_tmp.frame_number)  {
											tmp_number = str_data_tmp.frame_number;
											//memset(send_buff_ipb[sav_cnt], '\0', BUFFER_LEN);
											memcpy(send_buff_ipb[sav_cnt], ch_buff_3_ipb[sav_cnt], str_data_tmp.frame_size+sizeof(STRDATA));
											DEV_LEVEL2 ("sav_cnt:%d , str_data_tmp.frame_number:%d\n" ,sav_cnt, str_data_tmp.frame_number);
											break;
										}
										else usleep(rtimeout.tv_usec);
									}
									else if (tmp_gop < str_data_tmp.frame_gop ) {
										str_data_tmp.frame_size=0;
										memcpy(send_buff_ipb[sav_cnt], 	(STRDATA *)&str_data_tmp,sizeof(STRDATA));
										break;
									}
									else usleep(rtimeout.tv_usec);
								}
							}														
						}															
						if(str_data_tmp.frame_type==0) SAV_I_BYTE+=str_data_tmp.frame_size;
						if(str_data_tmp.frame_type==1) SAV_P_BYTE+=str_data_tmp.frame_size;
						if(str_data_tmp.frame_type==2) SAV_B_BYTE+=str_data_tmp.frame_size;
						if( sav_cnt == 0 ){
							m1_timeout.tv_sec = str_data_tmp.tv_sec;
							m1_timeout.tv_usec = str_data_tmp.tv_usec;
						}
						else if( (m2_timeout.tv_sec <= str_data_tmp.tv_sec) || (m2_timeout.tv_usec <= str_data_tmp.tv_usec) ){
							m2_timeout.tv_sec = str_data_tmp.tv_sec;
							m2_timeout.tv_usec = str_data_tmp.tv_usec;
						}
						GOP_STR_NUM=str_data_tmp.frame_nm;
					}
					MEM_TIME=1000000*(m2_timeout.tv_sec-m1_timeout.tv_sec)+(m2_timeout.tv_usec-m1_timeout.tv_usec);										
					break;
				}

				default:
					break;
			}//end of switch(ch_id)
			
			MEM_TIME+=1000000/MAX_FRAME_IPB;
			MEM_TIME = MEM_TIME/1000000;

			DEV_LEVEL2 ("\rCH%d:%07.2F", ch_id, MEM_TIME);				

			for(snd_cnt=0;snd_cnt<GOP_STR_NUM;snd_cnt++)
			{				
				if( memcpy((STRDATA *)&str_data_cur, send_buff_ipb[snd_cnt], sizeof(STRDATA)) != NULL )
				{			
					if( (str_data_cur.frame_number == INIT_STREAM_NUM) || (str_data_sav.frame_number >= MAX_STREAM_NUM) ) 
						str_data_sav.frame_number=0;
					if( (str_data_cur.frame_gop == INIT_STREAM_NUM) || (str_data_sav.frame_gop >= MAX_STREAM_NUM) ) 
						str_data_sav.frame_gop=0;
				
					if( (str_data_sav.frame_number < str_data_cur.frame_number) && 
						(str_data_cur.frame_size > 1) )
					{					
						switch(str_data_cur.frame_type) 
						{
							case 0:																	
								NET_TIME=0;
								NET_BYTE=0;							
								
								if( (str_data_sav.frame_gop < str_data_cur.frame_gop) && 
									(str_data_cur.frame_gop_num==0) ) 
								{							
							
									if( str_data_cur.frame_gop-str_data_sav.frame_gop == 1)  
										JUMPED_GOP = 0;
									else
										JUMPED_GOP = 1;

									if( ((long double)SAV_I_BYTE/MEM_TIME) < NET_RATE )
									{
										if( (((long double)SAV_I_BYTE+(long double)SAV_P_BYTE)/MEM_TIME) < NET_RATE )
										{
											SEND_P_FLAG=1;
											if( JUMPED_GOP )
											{
												SEND_B_FLAG=0;
											}
											else
											{
												if( (((long double)SAV_I_BYTE+(long double)SAV_P_BYTE+(long double)SAV_B_BYTE)/MEM_TIME) < NET_RATE ) 
													SEND_B_FLAG=1;
												else	SEND_B_FLAG=0;
											}
										}
										else SEND_P_FLAG=0;
									}
									else SEND_P_FLAG=0;
									
									str_data_sav.frame_gop_num=0;	
									str_data_sav.frame_gop = str_data_cur.frame_gop;

									str_data_snd.frame_id = str_data_cur.frame_id;
									str_data_snd.frame_number = str_data_cur.frame_number;
									str_data_snd.frame_size = str_data_cur.frame_size;
									str_data_snd.frame_type = str_data_cur.frame_type;
									str_data_snd.frame_gop = str_data_cur.frame_gop;
									str_data_snd.frame_gop_num = 0;
									
									(long)NET_GOP=(long)str_data_cur.frame_gop;	
									
									gettimeofday( (struct timeval *)&s1_timeout, (struct timezone *)&rok_zone);
									DEV_LEVEL2 ("I:%d:%d\n",  str_data_snd.frame_gop, str_data_snd.frame_number);
									if ( (write_slice_bytes=write_slice(client_sock, (STRDATA *)&str_data_snd, 
										send_buff_ipb[snd_cnt]+sizeof(STRDATA))) <=0 ) 
									{
										stop_flag=1;
										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);
									}
									gettimeofday( (struct timeval *)&s2_timeout, (struct timezone *)&rok_zone);
									SND_TIME=1000000*(s2_timeout.tv_sec-s1_timeout.tv_sec)+(s2_timeout.tv_usec-s1_timeout.tv_usec);									
									NET_TIME+=(SND_TIME/1000000);
									(long)NET_BYTE+=(long)write_slice_bytes;

⌨️ 快捷键说明

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