您的位置:首页 > 其它

ts packet结构分析

2017-10-29 16:19 323 查看

ts packet结构分析



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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: