📄 stream_server.c
字号:
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 + -