ts packet结构分析

ts packet结构分析

这里写图片描述

Packet Header分析

|Packet Header:0x47 0x43 0xe8 0x10 |
| 1 | sync_byte | 0x47 | 同步字节 |
| 2 | transport_error_indicator | “0”
| 3 |payload_unit_start_indicator| “1” |在前4个字节后会有一个调整字节。所以实际数据应该为去除第一个字节后的数据。
| 4 | transport_priority | “0” | 传输优先级低
| 5 | PID | 0x03e8 | 0x03e8说明数据包是PMT表信息
| 6 | transport_scrambling_control | “00” | 未加密
| 7 | adaptation_field_control | 附加区域控制
| 8 | continuity_counte | “0010” |包递增计数器


int mpegts_resync(char* buff,u_int32_t usize){
	int i=0;
	char c;
	for(i = 0;i < 0xffff; i++) {
		if(usize < i){
			return -1;
		}
		c = buff[i];
		if (c == 0x47 && (vailide_int ==0 || i>=vailide_int-1)) {
			printf("we have find tsync =%d",i);
			return i;
		}
	}
	return -1; 
}

int demux_file( char* buff,u_int32_t pid,u_int32_t totalsize)
{
	char*buf=NULL;
	u_int64_t pn=0;
	int n;
	u_int32_t readsize=0;
	if(lastleftsize!=0){
		vailide_int=buf_len-lastleftsize;
	    readsize=mpegts_resync(buff,totalsize);
	}else
		mpegts_resync(buff,totalsize);
	if(readsize>0 && !demuxer.M2TS &&lastleftsize+readsize==188){
		memcpy(tsbuff+lastleftsize,buff,readsize);
		demux_ts_packet(&demuxer,tsbuff,pid);
	}
	if(readsize>0 && !demuxer.M2TS &&lastleftsize+readsize!=188){
		int a=0;
	}
	if(readsize>0 && demuxer.M2TS && lastleftsize+readsize==192){
		memcpy(tsbuff+lastleftsize,buff,readsize);
		demux_ts_packet(&demuxer,tsbuff,pid);
	}
	totalsize=totalsize-readsize;
	for(pn=1;readsize>=0;pn++)
	{
		if(buf_len){
			if(totalsize<buf_len)
			{
				printf("lastleftsize=%d \n",lastleftsize);
				lastleftsize=totalsize;
				memcpy(tsbuff,buff+readsize,lastleftsize);
				break;  
			}
			buf=buff+readsize;
			totalsize=totalsize-buf_len;
			readsize=readsize+buf_len;
		}
		else{
			if(totalsize<188){
				printf("lastleftsize=%d \n",lastleftsize);
				lastleftsize=totalsize;
				memcpy(tsbuff,buff+readsize,lastleftsize);
				break;
			}
			buf=buff+readsize;
			printf("buff+readsize value=0x%x buf[4]=0x%x \n",buf[0],buf[4]);
			if(buf[0]==0x47 && buf[4]!=0x47)
			{
				buf_len=188;
				demuxer.M2TS=0;
				totalsize=totalsize-188;
				readsize=readsize+188;
			}else if(buf[0]!=0x47 && buf[4]==0x47)
			{
				if(totalsize<192){
					lastleftsize=totalsize;
					memcpy(tsbuff,buff+readsize,lastleftsize);
					break;
				}
				buf=buff+readsize;
				buf_len=192;
				demuxer.M2TS=1;
				totalsize=totalsize-192;
				readsize=readsize+192;
			}else
			{
				return -1;
			}
		}
		if((n=demux_ts_packet(&demuxer,buf,pid)))
		{
			return -1;
		}
	}
}
void adjust_TS_packet_header(AML_TS_header_t  pheader,char*buf)
{
	pheader->transport_error_indicator        = buf[1] >> 7;  //16;
	pheader->payload_unit_start_indicator    = buf[1] >> 6 & 0x01;
	pheader->transport_priority                = buf[1] >> 5 & 0x01;
	pheader->PID                            = (buf[1] & 0x1F) << 8 | buf[2];
	pheader->transport_scrambling_control    = buf[3] >> 6;
	pheader->adaption_field_control            = buf[3] >> 4 & 0x03;
	pheader->continuity_counter                = buf[3] & 0x0f;
}

stream_t get_Stream_pid(demuxer_t demuxer,int pid){
	int i;
	for(i=0;i<=demuxer->index;i++){
		streamMap pStreamMap=demuxer->streamsmap[i];
		if(pStreamMap.pid==pid){
			printf("pStreamMap.pid=%d \n",pStreamMap.pid);
			break;
		}
		else if(i==demuxer->index) {
			demuxer->index++;
			demuxer->streamsmap[i].pid=pid;
			printf("demuxer->index=%d \n",demuxer->index);
			AML_stream_reset(&demuxer->streamsmap[i].stream);
			break;
		}		
		continue;
	}	 
	return  &demuxer->streamsmap[i].stream;
}
发布了38 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhiyanzhai563/article/details/78386098
ts
今日推荐