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;
}