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

📄 ctools.c

📁 DVBstream is based on the ts-rtp package available at http://www.linuxtv.org. It broadcasts a (subs
💻 C
📖 第 1 页 / 共 4 页
字号:
				//	cread_pes(buf+c,&pes);			        i++;			} else done = 1;			kill_pes(&pes);		} while (c < length && !done);		p->npes = i;		c = q;	} }/*  conversion*/void init_trans(trans *p){	int i;	p->found = 0;	p->pes = 0;	p->is_full = 0;	p->pes_start = 0;	p->pes_started = 0;	p->set = 0;	for (i = 0; i < MASKL*MAXFILT ; i++){		p->mask[i] = 0;		p->filt[i] = 0;	}	for (i = 0; i < MAXFILT ; i++){		p->sec[i].found = 0;		p->sec[i].length = 0;	}	}int set_trans_filt(trans *p, int filtn, u16 pid, u8 *mask, u8 *filt, int pes){	int i;	int off;	if ( filtn > MAXFILT-1 || filtn<0 ) return -1;	p->pid[filtn] = pid;	if (pes) p->pes |= (tflags)(1 << filtn);	else {		off = MASKL*filtn;		p->pes &= ~((tflags) (1 << filtn) );		for (i = 0; i < MASKL ; i++){			p->mask[off+i] = mask[i];			p->filt[off+i] = filt[i];		}	}			p->set |= (tflags) (1 << filtn);	return 0;}void clear_trans_filt(trans *p,int filtn){	int i;	p->set &= ~((tflags) (1 << filtn) );	p->pes &= ~((tflags) (1 << filtn) );	p->is_full &= ~((tflags) (1 << filtn) );	p->pes_start &= ~((tflags) (1 << filtn) );	p->pes_started &= ~((tflags) (1 << filtn) );	for (i = MASKL*filtn; i < MASKL*(filtn+1) ; i++){		p->mask[i] = 0;		p->filt[i] = 0;	}	p->sec[filtn].found = 0;	p->sec[filtn].length = 0;}int filt_is_set(trans *p, int filtn){	if (p->set & ((tflags)(1 << filtn))) return 1;	return 0;}int pes_is_set(trans *p, int filtn){	if (p->pes & ((tflags)(1 << filtn))) return 1;	return 0;}int pes_is_started(trans *p, int filtn){	if (p->pes_started & ((tflags)(1 << filtn))) return 1;	return 0;}int pes_is_start(trans *p, int filtn){	if (p->pes_start & ((tflags)(1 << filtn))) return 1;	return 0;}int filt_is_ready(trans *p,int filtn){	if (p->is_full & ((tflags)(1 << filtn))) return 1;	return 0;}void trans_filt(u8 *buf, int count, trans *p){	int c=0;	//fprintf(stderr,"trans_filt\n");		while (c < count && p->found <1 ){		if ( buf[c] == 0x47) p->found = 1;		c++;		p->packet[0] = 0x47;	}	if (c == count) return;		while( c < count && p->found < 188 && p->found > 0 ){		p->packet[p->found] = buf[c];		c++;		p->found++;	}	if (p->found == 188){		p->found = 0;		filter(p);	}	if (c < count) trans_filt(buf+c,count-c,p);} void filter(trans *p){	int l,c;	int tpid;	u8 flag,flags;	u8 adapt_length = 0;	u8 cpid[2];	//	fprintf(stderr,"filter\n");	cpid[0] = p->packet[1];	cpid[1] = p->packet[2];	tpid = get_pid(cpid);	flag = cpid[0];	flags = p->packet[3];		if ( flags & ADAPT_FIELD ) {		// adaption field		adapt_length = p->packet[4];	}	c = 5 + adapt_length - (int)(!(flags & ADAPT_FIELD));	if (flags & PAYLOAD){		for ( l = 0; l < MAXFILT ; l++){			if ( filt_is_set(p,l) ) {				if ( p->pid[l] == tpid) {					if ( pes_is_set(p,l) ){						if (cpid[0] & PAY_START){							p->pes_started |= 								(tflags) 								(1 << l);							p->pes_start |= 								(tflags) 								(1 << l);						} else {							p->pes_start &= ~ 								((tflags) 								(1 << l));						}						pes_filter(p,l,c);					} else {						sec_filter(p,l,c);					}					}			}		}	}}	void pes_filter(trans *p, int filtn, int off){	int count,c;	u8 *buf;	if (filtn < 0 || filtn >= MAXFILT) return; 	count = 188 - off;	c = 188*filtn;	buf = p->packet+off;	if (pes_is_started(p,filtn)){		p->is_full |= (tflags) (1 << filtn);		memcpy(p->transbuf+c,buf,count);		p->transcount[filtn] = count;	}}section *get_filt_sec(trans *p, int filtn){	section *sec;		sec = &p->sec[filtn];	p->is_full &= ~((tflags) (1 << filtn) );	return sec;}int get_filt_buf(trans *p, int filtn,u8 **buf){	*buf = p->transbuf+188*filtn;	p->is_full &= ~((tflags) (1 << filtn) );	return p->transcount[filtn];}void sec_filter(trans *p, int filtn, int off){	int i,j;	int error;	int count,c;	u8 *buf, *secbuf;	section *sec;	//	fprintf(stderr,"sec_filter\n");	if (filtn < 0 || filtn >= MAXFILT) return; 	count = 188 - off;	c = 0;	buf = p->packet+off;	sec = &p->sec[filtn];	secbuf = sec->payload;	if(!filt_is_ready(p,filtn)){		p->is_full &= ~((tflags) (1 << filtn) );		sec->found = 0;		sec->length = 0;	}			if ( !sec->found ){		c = buf[c]+1;		if (c >= count) return;		sec->id = buf[c];		secbuf[0] = buf[c];		c++;		sec->found++;		sec->length = 0;	}		while ( c < count && sec->found < 3){		secbuf[sec->found] = buf[c];		c++;		sec->found++;	}	if (c == count) return;		if (!sec->length && sec->found == 3){		sec->length |= ((secbuf[1] & 0x0F) << 8); 		sec->length |= (secbuf[2] & 0xFF);	}		while ( c < count && sec->found < sec->length+3){		secbuf[sec->found] = buf[c];		c++;		sec->found++;	}	if ( sec->length && sec->found == sec->length+3 ){		error=0;		for ( i = 0; i < MASKL; i++){			if (i > 0 ) j=2+i;			else j = 0;			error += (sec->payload[j]&p->mask[MASKL*filtn+i])^				(p->filt[MASKL*filtn+i]&				 p->mask[MASKL*filtn+i]);		}		if (!error){			p->is_full |= (tflags) (1 << filtn);		}		if (buf[0]+1 < c ) c=count;	}		if ( c < count ) sec_filter(p, filtn, off);}#define MULT 1024void write_ps_headr( ps_packet *p, u8 *pts,int fd){	long  muxr = 37500;	u8    audio_bound = 1;	u8    fixed = 0;	u8    CSPS = 0;	u8    audio_lock = 1;	u8    video_lock = 1;	u8    video_bound = 1;	u8    stream1 = 0XC0;	u8    buffer1_scale = 1;	u32   buffer1_size = 32;	u8    stream2 = 0xE0;	u8    buffer2_scale = 1;	u32   buffer2_size = 230;                    	init_ps(p);		p->mpeg = 2;// SCR = 0	p->scr[0] = 0x44;	p->scr[1] = 0x00;	p->scr[2] = 0x04;	p->scr[3] = 0x00;	p->scr[4] = 0x04;	p->scr[5] = 0x01;	// SCR = PTS	p->scr[0] = 0x44 | ((pts[0] >> 3)&0x18) | ((pts[0] >> 4)&0x03);	p->scr[1] = 0x00 | ((pts[0] << 4)&0xF0) | ((pts[1] >> 4)&0x0F);	p->scr[2] = 0x04 | ((pts[1] << 4)&0xF0) | ((pts[2] >> 4)&0x08)		| ((pts[2] >> 5)&0x03);	p->scr[3] = 0x00 | ((pts[2] << 3)&0xF8) | ((pts[3] >> 5)&0x07);	p->scr[4] = 0x04 | ((pts[3] << 3)&0xF8);	p->scr[5] = 0x01;		p->mux_rate[0] = (u8)(muxr >> 14);	p->mux_rate[1] = (u8)(0xff & (muxr >> 6));	p->mux_rate[2] = (u8)(0x03 | ((muxr & 0x3f) << 2));	p->stuff_length = 0xF8;		p->sheader_llength[0] = 0x00;	p->sheader_llength[1] = 0x0c;	setl_ps(p);		p->rate_bound[0] = (u8)(0x80 | (muxr >>15));	p->rate_bound[1] = (u8)(0xff & (muxr >> 7));	p->rate_bound[2] = (u8)(0x01 | ((muxr & 0x7f)<<1));			p->audio_bound = (u8)((audio_bound << 2)|(fixed << 1)|CSPS);	p->video_bound = (u8)((audio_lock << 7)|			      (video_lock << 6)|0x20|video_bound);	p->reserved = (u8)(0xFF);		p->data[0] =  stream2;	p->data[1] =  (u8) (0xc0 | (buffer2_scale << 5) | 			    (buffer2_size >> 8));	p->data[2] =  (u8) (buffer2_size & 0xff);	p->data[3] =  stream1;	p->data[4] =  (u8) (0xc0 | (buffer1_scale << 5) | 			    (buffer1_size >> 8));	p->data[5] =  (u8) (buffer1_size & 0xff);		write_ps(fd, p);	kill_ps(p);}void twrite(u8 const *buf){	int l = TS_SIZE;	int c = 0;	int w;	while (l){		w = write(STDOUT_FILENO,buf+c,l);		if (w>=0){			l-=w;			c+=w;		}	}}void init_p2t(p2t_t *p, void (*fkt)(u8 const *buf)){	memset(p->pes,0,TS_SIZE);	p->counter = 0;	p->pos = 0;	p->frags = 0;	if (fkt) p->t_out = fkt;	else p->t_out = twrite;}void clear_p2t(p2t_t *p){	memset(p->pes,0,TS_SIZE);	p->counter = 0;	p->pos = 0;	p->frags = 0;}long int find_pes_header(u8 const *buf, long int length, int *frags){	int c = 0;	int found = 0;	*frags = 0;	while (c < length-3 && !found) {		if (buf[c] == 0x00 && buf[c+1] == 0x00 && 		    buf[c+2] == 0x01) {			switch ( buf[c+3] ) {			case 0xBA:			case PROG_STREAM_MAP:			case PRIVATE_STREAM2:			case PROG_STREAM_DIR:			case ECM_STREAM     :			case EMM_STREAM     :			case PADDING_STREAM :			case DSM_CC_STREAM  :			case ISO13522_STREAM:			case PRIVATE_STREAM1:			case AUDIO_STREAM_S ... AUDIO_STREAM_E:			case VIDEO_STREAM_S ... VIDEO_STREAM_E:				found = 1;				break;							default:				c++;				break;			}			} else c++;	}	if (c == length-3 && !found){		if (buf[length-1] == 0x00) *frags = 1;		if (buf[length-2] == 0x00 &&		    buf[length-1] == 0x00) *frags = 2;		if (buf[length-3] == 0x00 &&		    buf[length-2] == 0x00 &&		    buf[length-1] == 0x01) *frags = 3;		return -1;	}	return c;}void pes_to_ts( u8 const *buf, long int length, u16 pid, p2t_t *p){	int c,c2,l,add;	int check,rest;	c = 0;	c2 = 0;	if (p->frags){		check = 0;		switch(p->frags){		case 1:			if ( buf[c] == 0x00 && buf[c+1] == 0x01 ){				check = 1;				c += 2;			}			break;		case 2:			if ( buf[c] == 0x01 ){				check = 1;				c++;			}			break;		case 3:			check = 1;		}		if(check){			switch ( buf[c] ) {							case PROG_STREAM_MAP:			case PRIVATE_STREAM2:			case PROG_STREAM_DIR:			case ECM_STREAM     :			case EMM_STREAM     :			case PADDING_STREAM :			case DSM_CC_STREAM  :			case ISO13522_STREAM:			case PRIVATE_STREAM1:			case AUDIO_STREAM_S ... AUDIO_STREAM_E:			case VIDEO_STREAM_S ... VIDEO_STREAM_E:				p->pes[0] = 0x00;				p->pes[1] = 0x00;				p->pes[2] = 0x01;				p->pes[3] = buf[c];				p->pos=4;				memcpy(p->pes+p->pos,buf+c,TS_SIZE-4-p->pos);				c += TS_SIZE-4-p->pos;				p_to_t(p->pes,TS_SIZE-4,pid,&p->counter,				       p->t_out);				clear_p2t(p);				break;							default:				c=0;				break;			}		}		p->frags = 0;	}			if (p->pos){		c2 = find_pes_header(buf+c,length-c,&p->frags);		if (c2 >= 0 && c2 < TS_SIZE-4-p->pos){			l = c2+c;		} else l = TS_SIZE-4-p->pos;		memcpy(p->pes+p->pos,buf,l);		c += l;		p->pos += l;		p_to_t(p->pes,p->pos,pid,&p->counter,		       p->t_out);		clear_p2t(p);	}				add = 0;	while (c < length){		c2 = find_pes_header(buf+c+add,length-c-add,&p->frags);		if (c2 >= 0) {			c2 += c+add;			if (c2 > c){				p_to_t(buf+c,c2-c,pid,&p->counter,				       p->t_out);				c = c2;				clear_p2t(p);				add = 0;			} else add = 1;		} else {			l = length-c;			rest = l % (TS_SIZE-4);			l -= rest;			p_to_t(buf+c,l,pid,&p->counter,			       p->t_out);			memcpy(p->pes,buf+c+l,rest);			p->pos = rest;			c = length;		}	}}void p_to_t( u8 const *buf, long int length, u16 pid, u8 *counter, 	    void (*ts_write)(u8 const *)){  	int l, pes_start;	u8 obuf[TS_SIZE];	long int c = 0;	pes_start = 0;	if ( length > 3 && 	     buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x01 )		switch (buf[3]){			case PROG_STREAM_MAP:			case PRIVATE_STREAM2:			case PROG_STREAM_DIR:			case ECM_STREAM     :			case EMM_STREAM     :			case PADDING_STREAM :			case DSM_CC_STREAM  :			case ISO13522_STREAM:			case PRIVATE_STREAM1:			case AUDIO_STREAM_S ... AUDIO_STREAM_E:			case VIDEO_STREAM_S ... VIDEO_STREAM_E:				pes_start = 1;				break;							default:				break;		}				while ( c < length ){		memset(obuf,0,TS_SIZE);		if (length - c >= TS_SIZE-4){			l = write_ts_header(pid, counter, pes_start					     , obuf, TS_SIZE-4);			memcpy(obuf+l, buf+c, TS_SIZE-l);			c += TS_SIZE-l;		} else { 			l = write_ts_header(pid, counter, pes_start					     , obuf, length-c);			memcpy(obuf+l, buf+c, TS_SIZE-l);			c = length;		}

⌨️ 快捷键说明

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