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

📄 transform.c

📁 DVBstream is based on the ts-rtp package available at http://www.linuxtv.org. It broadcasts a (subs
💻 C
📖 第 1 页 / 共 3 页
字号:
		fprintf(stderr,"Not a TS\n");		return;	} else {		memcpy(buf,mbuf+i,TS_SIZE-i);		if ((count = read(fdin,mbuf,i))<0)			perror("reading");		memcpy(buf+TS_SIZE-i,mbuf,i);		i = 188;	}	count = 1;	while (count > 0){		if ((count = read(fdin,buf+i,IN_SIZE-i))<0)			perror("reading");				if (!pidv){                        find_bavpids(buf+i, IN_SIZE-i, &pidv, &dummy);                        if (pidv) fprintf(stderr, "vpid %d (0x%02x)\n",					  pidv,pidv);                }                 if (!pida){                        find_bavpids(buf+i, IN_SIZE-i, &dummy, &pida);                        if (pida) fprintf(stderr, "apid %d (0x%02x)\n",					  pida,pida);                } 		for( i = 0; i < count; i+= TS_SIZE){			uint8_t off = 0;			if ( count - i < TS_SIZE) break;			pid = get_pid(buf+i+1);			if (!(buf[3+i]&0x10)) // no payload?				continue;			if (pid == pidv){				p = &pv;			} else {				if (pid == pida){					p = &pa;				} else continue;			}			if ( buf[1+i]&0x40) {				if (p->plength == MMAX_PLENGTH-6){					p->plength = p->found-6;					p->found = 0;					send_ipack(p);					reset_ipack(p);				}			}			if ( buf[3+i] & 0x20) {  // adaptation field?				off = buf[4+i] + 1;			}        			instant_repack(buf+4+off+i, TS_SIZE-4-off, p);		}		i = 0;	}}#define INN_SIZE 2*IN_SIZEvoid insert_pat_pmt( int fdin, int fdout){		uint8_t buf[INN_SIZE];	uint8_t mbuf[TS_SIZE];	int i;	int count = 1;	uint16_t pida = 0;	uint16_t pidv = 0;	int written,c;	uint8_t c0 = 0;	uint8_t c1 = 0;	find_avpids(fdin, &pidv, &pida);	 	count = read(fdin,mbuf,TS_SIZE);	for ( i = 0; i < 188 ; i++){		if ( mbuf[i] == 0x47 ) break;	}	if ( i == 188){		fprintf(stderr,"Not a TS\n");		return;	} else {		memcpy(buf,mbuf+i,TS_SIZE-i);		count = read(fdin,mbuf,i);		memcpy(buf+TS_SIZE-i,mbuf,i);		i = 188;	}		count = 1;	while (count > 0){		tspid1[24]  = pidv;		tspid1[23] |= (pidv >> 8) & 0x3F;		tspid1[29]  = pida;		tspid1[28] |= (pida >> 8) & 0x3F;				write(fdout,tspid0,188);		write(fdout,tspid1,188);		count = read(fdin,buf+i,INN_SIZE-i);				written = 0;		while (written < IN_SIZE){			c = write(fdout,buf,INN_SIZE);			if (c>0) written += c;		}		tspid0[3] |= (c0++) 			& 0x0F ;		tspid1[3] |= (c1++) 			& 0x0F ;			i=0;	}}void get_pes (uint8_t *buf, int count, p2p *p, void (*func)(p2p *p)){	int l;	unsigned short *pl;	int c=0;	uint8_t headr[3] = { 0x00, 0x00, 0x01} ;	while (c < count && (p->mpeg == 0 ||			     (p->mpeg == 1 && p->found < 7) ||			     (p->mpeg == 2 && p->found < 9))	       &&  (p->found < 5 || !p->done)){		switch ( p->found ){		case 0:		case 1:			if (buf[c] == 0x00) p->found++;			else p->found = 0;			c++;			break;		case 2:			if (buf[c] == 0x01) p->found++;			else if (buf[c] == 0){				p->found = 2;			} else p->found = 0;			c++;			break;		case 3:			p->cid = 0;			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:				p->done = 1;			case PRIVATE_STREAM1:			case VIDEO_STREAM_S ... VIDEO_STREAM_E:			case AUDIO_STREAM_S ... AUDIO_STREAM_E:				p->found++;				p->cid = buf[c];				c++;				break;			default:				p->found = 0;				break;			}			break;					case 4:			if (count-c > 1){				pl = (unsigned short *) (buf+c);				p->plength =  ntohs(*pl);				p->plen[0] = buf[c];				c++;				p->plen[1] = buf[c];				c++;				p->found+=2;			} else {				p->plen[0] = buf[c];				p->found++;				return;			}			break;		case 5:			p->plen[1] = buf[c];			c++;			pl = (unsigned short *) p->plen;			p->plength = ntohs(*pl);			p->found++;			break;		case 6:			if (!p->done){				p->flag1 = buf[c];				c++;				p->found++;				if ( (p->flag1 & 0xC0) == 0x80 ) p->mpeg = 2;				else {					p->hlength = 0;					p->which = 0;					p->mpeg = 1;					p->flag2 = 0;				}			}			break;		case 7:			if ( !p->done && p->mpeg == 2){				p->flag2 = buf[c];				c++;				p->found++;			}				break;		case 8:			if ( !p->done && p->mpeg == 2){				p->hlength = buf[c];				c++;				p->found++;			}			break;					default:			break;		}	}	if (!p->plength) p->plength = MMAX_PLENGTH-6;	if ( p->done || ((p->mpeg == 2 && p->found >= 9)  || 	     (p->mpeg == 1 && p->found >= 7)) ){		switch (p->cid){					case AUDIO_STREAM_S ... AUDIO_STREAM_E:					case VIDEO_STREAM_S ... VIDEO_STREAM_E:		case PRIVATE_STREAM1:			memcpy(p->buf, headr, 3);			p->buf[3] = p->cid;			memcpy(p->buf+4,p->plen,2);			if (p->mpeg == 2 && p->found == 9){				p->buf[6] = p->flag1;				p->buf[7] = p->flag2;				p->buf[8] = p->hlength;			}			if (p->mpeg == 1 && p->found == 7){				p->buf[6] = p->flag1;			}			if (p->mpeg == 2 && (p->flag2 & PTS_ONLY) &&  			    p->found < 14){				while (c < count && p->found < 14){					p->pts[p->found-9] = buf[c];					p->buf[p->found] = buf[c];					c++;					p->found++;				}				if (c == count) return;			}			if (p->mpeg == 1 && p->which < 2000){				if (p->found == 7) {					p->check = p->flag1;					p->hlength = 1;				}				while (!p->which && c < count && 				       p->check == 0xFF){					p->check = buf[c];					p->buf[p->found] = buf[c];					c++;					p->found++;					p->hlength++;				}				if ( c == count) return;								if ( (p->check & 0xC0) == 0x40 && !p->which){					p->check = buf[c];					p->buf[p->found] = buf[c];					c++;					p->found++;					p->hlength++;					p->which = 1;					if ( c == count) return;					p->check = buf[c];					p->buf[p->found] = buf[c];					c++;					p->found++;					p->hlength++;					p->which = 2;					if ( c == count) return;				}				if (p->which == 1){					p->check = buf[c];					p->buf[p->found] = buf[c];					c++;					p->found++;					p->hlength++;					p->which = 2;					if ( c == count) return;				}								if ( (p->check & 0x30) && p->check != 0xFF){					p->flag2 = (p->check & 0xF0) << 2;					p->pts[0] = p->check;					p->which = 3;				} 				if ( c == count) return;				if (p->which > 2){					if ((p->flag2 & PTS_DTS_FLAGS)					    == PTS_ONLY){						while (c < count && 						       p->which < 7){							p->pts[p->which-2] =								buf[c];							p->buf[p->found] = 								buf[c];							c++;							p->found++;							p->which++;							p->hlength++;						}						if ( c == count) return;					} else if ((p->flag2 & PTS_DTS_FLAGS) 						   == PTS_DTS){						while (c < count && 						       p->which< 12){							if (p->which< 7)								p->pts[p->which								      -2] =									buf[c];							p->buf[p->found] = 								buf[c];							c++;							p->found++;							p->which++;							p->hlength++;						}						if ( c == count) return;					}					p->which = 2000;				}										}			while (c < count && p->found < p->plength+6){				l = count -c;				if (l+p->found > p->plength+6)					l = p->plength+6-p->found;				memcpy(p->buf+p->found, buf+c, l);				p->found += l;				c += l;			}						if(p->found == p->plength+6)				func(p);						break;		}		if ( p->done ){			if( p->found + count - c < p->plength+6){				p->found += count-c;				c = count;			} else {				c += p->plength+6 - p->found;				p->found = p->plength+6;			}		}		if (p->plength && p->found == p->plength+6) {			p->found = 0;			p->done = 0;			p->plength = 0;			memset(p->buf, 0, MAX_PLENGTH);			if (c < count)				get_pes(buf+c, count-c, p, func);		}	}	return;}void setup_pes2ts( p2p *p, uint32_t pida, uint32_t pidv, 		   void (*ts_write)(uint8_t *buf, int count, p2p *p)){	init_p2p( p, ts_write, 2048);	p->pida = pida;	p->pidv = pidv;	p->acounter = 0;	p->vcounter = 0;	p->count1 = 0;	p->count0 = 0;}void kpes_to_ts( p2p *p,uint8_t *buf ,int count ){	get_pes(buf,count, p,pes_in_ts);}void setup_ts2pes( p2p *pa, p2p *pv, uint32_t pida, uint32_t pidv, 		   void (*pes_write)(uint8_t *buf, int count, p2p *p)){	init_p2p( pa, pes_write, 2048);	init_p2p( pv, pes_write, 2048);	pa->pid = pida;	pv->pid = pidv;}void kts_to_pes( p2p *p, uint8_t *buf) // don't need count (=188){	uint8_t off = 0;	uint16_t pid = 0;	if (!(buf[3]&PAYLOAD)) // no payload?		return;	pid = get_pid(buf+1);				if (pid != p->pid) return;	if ( buf[1]&PAY_START) {		if (p->plength == MMAX_PLENGTH-6){			p->plength = p->found-6;			p->found = 0;			pes_repack(p);		}	}	if ( buf[3] & ADAPT_FIELD) {  // adaptation field?		off = buf[4] + 1;		if (off+4 > 187) return;	}        	get_pes(buf+4+off, TS_SIZE-4-off, p , pes_repack);}// instant repackvoid reset_ipack(ipack *p){	p->found = 0;	p->cid = 0;	p->plength = 0;	p->flag1 = 0;	p->flag2 = 0;	p->hlength = 0;	p->mpeg = 0;	p->check = 0;	p->which = 0;	p->done = 0;	p->count = 0;	p->size = p->size_orig;}void init_ipack(ipack *p, int size,		void (*func)(uint8_t *buf,  int size, void *priv), int ps){	if ( !(p->buf = malloc(size)) ){		fprintf(stderr,"Couldn't allocate memory for ipack\n");		exit(1);	}	p->ps = ps;	p->size_orig = size;	p->func = func;	reset_ipack(p);	p->has_ai = 0;	p->has_vi = 0;	p->start = 0;}void free_ipack(ipack * p){	if (p->buf) free(p->buf);}int get_vinfo(uint8_t *mbuf, int count, VideoInfo *vi, int pr){	uint8_t *headr;	int found = 0;        int sw;	int form = -1;	int c = 0;	while (found < 4 && c+4 < count){		uint8_t *b;		b = mbuf+c;		if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01		     && b[3] == 0xb3) found = 4;		else {			c++;		}	}	if (! found) return -1;	c += 4;	if (c+12 >= count) return -1;	headr = mbuf+c;	vi->horizontal_size	= ((headr[1] &0xF0) >> 4) | (headr[0] << 4);	vi->vertical_size	= ((headr[1] &0x0F) << 8) | (headr[2]);            sw = (int)((headr[3]&0xF0) >> 4) ;        switch( sw ){	case 1:		if (pr)			fprintf(stderr,"Videostream: ASPECT: 1:1");		vi->aspect_ratio = 100;        		break;	case 2:		if (pr)			fprintf(stderr,"Videostream: ASPECT: 4:3");                vi->aspect_ratio = 133;        		break;	case 3:		if (pr)			fprintf(stderr,"Videostream: ASPECT: 16:9");                vi->aspect_ratio = 177;        		break;	case 4:		if (pr)			fprintf(stderr,"Videostream: ASPECT: 2.21:1");                vi->aspect_ratio = 221;        		break;        case 5 ... 15:		if (pr)			fprintf(stderr,"Videostream: ASPECT: reserved");                vi->aspect_ratio = 0;        		break;        default:                vi->aspect_ratio = 0;                        return -1;	}	if (pr)		fprintf(stderr,"  Size = %dx%d",vi->horizontal_size,			vi->vertical_size);        sw = (int)(headr[3]&0x0F);        switch ( sw ) {	case 1:		if (pr)			fprintf(stderr,"  FRate: 23.976 fps");                vi->framerate = 24000/1001.;		form = -1;		break;	case 2:		if (pr)			fprintf(stderr,"  FRate: 24 fps");                vi->framerate = 24;		form = -1;		break;	case 3:		if (pr)			fprintf(stderr,"  FRate: 25 fps");                vi->framerate = 25;		form = VIDEO_MODE_PAL;		break;	case 4:		if (pr)			fprintf(stderr,"  FRate: 29.97 fps");                vi->framerate = 30000/1001.;		form = VIDEO_MODE_NTSC;		break;	case 5:		if (pr)			fprintf(stderr,"  FRate: 30 fps");                vi->framerate = 30;		form = VIDEO_MODE_NTSC;		break;	case 6:		if (pr)			fprintf(stderr,"  FRate: 50 fps");                vi->framerate = 50;		form = VIDEO_MODE_PAL;		break;	case 7:		if (pr)			fprintf(stderr,"  FRate: 60 fps");                vi->framerate = 60;		form = VIDEO_MODE_NTSC;		break;	}	vi->bit_rate = 400*(((headr[4] << 10) & 0x0003FC00UL) 			    | ((headr[5] << 2) & 0x000003FCUL) | 			    (((headr[6] & 0xC0) >> 6) & 0x00000003UL));		if (pr){		fprintf(stderr,"  BRate: %.2f Mbit/s",(vi->bit_rate)/1000000.);		fprintf(stderr,"\n");	}        vi->video_format = form;	vi->off = c-4;	return c-4;}extern unsigned int bitrates[3][16];extern uint32_t freq[4];int get_ainfo(uint8_t *mbuf, int count, AudioInfo *ai, int pr){	uint8_t *headr;	int found = 0;	int c = 0;	int fr =0;		while (!found && c < count){		uint8_t *b = mbuf+c;		if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8)			found = 1;		else {			c++;		}	}		if (!found) return -1;	if (c+3 >= count) return -1;        headr = mbuf+c;	ai->layer = (headr[1] & 0x06) >> 1;        if (pr)		fprintf(stderr,"Audiostream: Layer: %d", 4-ai->layer);	ai->bit_rate = bitrates[(3-ai->layer)][(headr[2] >> 4 )]*1000;	if (pr){		if (ai->bit_rate == 0)			fprintf (stderr,"  Bit rate: free");		else if (ai->bit_rate == 0xf)			fprintf (stderr,"  BRate: reserved");		else			fprintf (stderr,"  BRate: %d kb/s", ai->bit_rate/1000);	}	fr = (headr[2] & 0x0c ) >> 2;	ai->frequency = freq[fr]*100;		if (pr){		if (ai->frequency == 3)			fprintf (stderr, "  Freq: reserved\n");		else			fprintf (stderr,"  Freq: %2.1f kHz\n", 				 ai->frequency/1000.);	}	ai->off = c;	return c;}unsigned int ac3_bitrates[32] =    {32,40,48,56,64,80,96,112,128,160,192,224,256,320,384,448,512,576,640,     0,0,0,0,0,0,0,0,0,0,0,0,0};uint32_t ac3_freq[4] = {480, 441, 320, 0};uint32_t ac3_frames[3][32] =    {{64,80,96,112,128,160,192,224,256,320,384,448,512,640,768,896,1024,      1152,1280,0,0,0,0,0,0,0,0,0,0,0,0,0},     {69,87,104,121,139,174,208,243,278,348,417,487,557,696,835,975,1114,      1253,1393,0,0,0,0,0,0,0,0,0,0,0,0,0},     {96,120,144,168,192,240,288,336,384,480,576,672,768,960,1152,1344,      1536,1728,1920,0,0,0,0,0,0,0,0,0,0,0,0,0}}; int get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr){	uint8_t *headr;	int found = 0;	int c = 0;	uint8_t frame;	int fr = 0;	while ( !found  && c < count){		uint8_t *b = mbuf+c;		if ( b[0] == 0x0b &&  b[1] == 0x77 )			found = 1;		else {			c++;		}	}		if (!found){		return -1;	}	ai->off = c;	if (c+5 >= count) return -1;	ai->layer = 0;  // 0 for AC3

⌨️ 快捷键说明

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