unsigned char *x264_rtp_unpackage( void *bufIn,int len)
{ //bufIn socket 接收到的rtp数据包, len 接收到rtp数据包长度,
//pBufOut 输出解包后数据包含nalu头部,pOutLen 解包包含nalu头的数据长度
int i=0;
int m_bSPSFound=0; //sps发现标志
int m_bWKFrame=1;//等待关键帧
int m_bAssemblingFrame=0;//组合帧
int m_bPFrameEnd=0; //结束帧
unsigned char *m_pStart;//起始
unsigned char *m_pEnd; //结束
int m_dwSize;
short int m_wSeq;
int m_ssrc=0;
int PayloadType;
int NALType = PayloadType;
int outsize;
int PayloadSize;//RTP负载长度,包括nalu头
int m_H264PAYLOADTYPE = 96; //负载类型
unsigned char *pBuf;
unsigned char *pPayload; //从rtp包第13个字节开始为RTP负载,包括nalu头和nalu负载
unsigned char *cp;
unsigned char *m_pBuf;//开辟空间存储接收到的rtp包
m_pBuf=(unsigned char *)calloc(1,BUF_SIZE);
void SetLostPacket()
{
m_bSPSFound = 0;
m_bWKFrame = 1;
m_bPFrameEnd = 0;
m_bAssemblingFrame = 0;
//memcpy(m_pStart,m_pBuf,BUF_SIZE);
m_pStart=m_pBuf;
m_dwSize = 0;
}
PayloadSize=len-12;
//printf("len=%d\n",len);
//printf("payloadsize=%d\n",len-12);
pPayload=pBuf+12;
m_pBuf=pPayload;
m_pStart=m_pBuf;
m_pEnd = m_pBuf+BUF_SIZE;//结束地址=起始地址+开辟存储空间长度
//printf("m_pStart=0x%x\n",m_pStart);
PayloadType = pPayload[0]&0x1f; //判断nal负载类型,5bit
pBuf=(unsigned char *)calloc(1,BUF_SIZE);//开辟空间存储接收到的rtp数据包
memcpy(pBuf,bufIn, len);//复制rtp包
if(len<=12) //判断接收到的数据包是否含有视频数据
{
printf("no rtp package recived!\n");
}
rtp_hdr_t m_RTP_Header;
cp=(unsigned char *)calloc(1,sizeof(m_RTP_Header));
cp[0]=pBuf[0];
cp[1]=pBuf[1];
m_RTP_Header.seq = pBuf[2];
m_RTP_Header.seq <<= 8;
m_RTP_Header.seq |= pBuf[3];
//printf("m_RTP_Header.seq=%d\n",m_RTP_Header.seq);
m_RTP_Header.ts = pBuf[4];
m_RTP_Header.ts <<= 8;
m_RTP_Header.ts |= pBuf[5];
m_RTP_Header.ts <<= 8;
m_RTP_Header.ts |= pBuf[6];
m_RTP_Header.ts <<= 8;
m_RTP_Header.ts |= pBuf[7];
m_RTP_Header.ssrc = pBuf[8];
m_RTP_Header.ssrc <<= 8;
m_RTP_Header.ssrc |= pBuf[9];
m_RTP_Header.ssrc <<= 8;
m_RTP_Header.ssrc |= pBuf[10];
m_RTP_Header.ssrc <<= 8;
m_RTP_Header.ssrc |= pBuf[11];
//检测版本信息
// Check the RTP version number (通常值为2):
m_RTP_Header.v=cp[0]>>6;
if ( m_RTP_Header.v != RTP_VERSION )
{
return 0;
}
//检测负载类型
// Check the Payload Type.
m_RTP_Header.pt=cp[1];
//printf("%d\n",m_RTP_Header.pt);
/*if ( m_RTP_Header.pt != 96 )
{
return 0 ;
}*/
NALType=PayloadType;
//printf("NALType=0x%x\n",NALType);
m_RTP_Header.m=pBuf[1]>>7;
//printf("m_RTP_Header.m=%d\n",m_RTP_Header.m);
{ //bufIn socket 接收到的rtp数据包, len 接收到rtp数据包长度,
//pBufOut 输出解包后数据包含nalu头部,pOutLen 解包包含nalu头的数据长度
int i=0;
int m_bSPSFound=0; //sps发现标志
int m_bWKFrame=1;//等待关键帧
int m_bAssemblingFrame=0;//组合帧
int m_bPFrameEnd=0; //结束帧
unsigned char *m_pStart;//起始
unsigned char *m_pEnd; //结束
int m_dwSize;
short int m_wSeq;
int m_ssrc=0;
int PayloadType;
int NALType = PayloadType;
int outsize;
int PayloadSize;//RTP负载长度,包括nalu头
int m_H264PAYLOADTYPE = 96; //负载类型
unsigned char *pBuf;
unsigned char *pPayload; //从rtp包第13个字节开始为RTP负载,包括nalu头和nalu负载
unsigned char *cp;
unsigned char *m_pBuf;//开辟空间存储接收到的rtp包
m_pBuf=(unsigned char *)calloc(1,BUF_SIZE);
void SetLostPacket()
{
m_bSPSFound = 0;
m_bWKFrame = 1;
m_bPFrameEnd = 0;
m_bAssemblingFrame = 0;
//memcpy(m_pStart,m_pBuf,BUF_SIZE);
m_pStart=m_pBuf;
m_dwSize = 0;
}
PayloadSize=len-12;
//printf("len=%d\n",len);
//printf("payloadsize=%d\n",len-12);
pPayload=pBuf+12;
m_pBuf=pPayload;
m_pStart=m_pBuf;
m_pEnd = m_pBuf+BUF_SIZE;//结束地址=起始地址+开辟存储空间长度
//printf("m_pStart=0x%x\n",m_pStart);
PayloadType = pPayload[0]&0x1f; //判断nal负载类型,5bit
pBuf=(unsigned char *)calloc(1,BUF_SIZE);//开辟空间存储接收到的rtp数据包
memcpy(pBuf,bufIn, len);//复制rtp包
if(len<=12) //判断接收到的数据包是否含有视频数据
{
printf("no rtp package recived!\n");
}
rtp_hdr_t m_RTP_Header;
cp=(unsigned char *)calloc(1,sizeof(m_RTP_Header));
cp[0]=pBuf[0];
cp[1]=pBuf[1];
m_RTP_Header.seq = pBuf[2];
m_RTP_Header.seq <<= 8;
m_RTP_Header.seq |= pBuf[3];
//printf("m_RTP_Header.seq=%d\n",m_RTP_Header.seq);
m_RTP_Header.ts = pBuf[4];
m_RTP_Header.ts <<= 8;
m_RTP_Header.ts |= pBuf[5];
m_RTP_Header.ts <<= 8;
m_RTP_Header.ts |= pBuf[6];
m_RTP_Header.ts <<= 8;
m_RTP_Header.ts |= pBuf[7];
m_RTP_Header.ssrc = pBuf[8];
m_RTP_Header.ssrc <<= 8;
m_RTP_Header.ssrc |= pBuf[9];
m_RTP_Header.ssrc <<= 8;
m_RTP_Header.ssrc |= pBuf[10];
m_RTP_Header.ssrc <<= 8;
m_RTP_Header.ssrc |= pBuf[11];
//检测版本信息
// Check the RTP version number (通常值为2):
m_RTP_Header.v=cp[0]>>6;
if ( m_RTP_Header.v != RTP_VERSION )
{
return 0;
}
//检测负载类型
// Check the Payload Type.
m_RTP_Header.pt=cp[1];
//printf("%d\n",m_RTP_Header.pt);
/*if ( m_RTP_Header.pt != 96 )
{
return 0 ;
}*/
NALType=PayloadType;
//printf("NALType=0x%x\n",NALType);
m_RTP_Header.m=pBuf[1]>>7;
//printf("m_RTP_Header.m=%d\n",m_RTP_Header.m);