RTP_h264打包源码.doc_第1页
RTP_h264打包源码.doc_第2页
RTP_h264打包源码.doc_第3页
RTP_h264打包源码.doc_第4页
RTP_h264打包源码.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

classCH264_RTP_PACK#defineRTP_VERSION2typedefstructNAL_msg_sbooleoFrame;unsignedchartype;/NALtypeunsignedchar*start;/pointertofirstlocationinthesendbufferunsignedchar*end;/pointertolastlocationinsendbufferunsignedlongsize;NAL_MSG_t;typedefstruct/LITTLE_ENDIANunsignedshortcc:4; /*CSRCcount*/unsignedshortx:1; /*headerextensionflag*/unsignedshortp:1; /*paddingflag*/unsignedshortv:2; /*packettype*/unsignedshortpt:7; /*payloadtype*/unsignedshortm:1; /*markerbit*/unsignedshortseq; /*sequencenumber*/unsignedlongts; /*timestamp*/unsignedlongssrc;/*synchronizationsource*/rtp_hdr_t;typedefstructtagRTP_INFONAL_MSG_tnal; /NALinformationrtp_hdr_trtp_hdr;/RTPheaderisassembledhereinthdr_len;/lengthofRTPheaderunsignedchar*pRTP; /pointertowhereRTPpackethasbeemassembledunsignedchar*start;/pointertostartofpayloadunsignedchar*end; /pointertoendofpayloadunsignedints_bit; /bitintheFUheaderunsignedinte_bit; /bitintheFUheaderboolFU_flag;/fragmentedNALUnitflagRTP_INFO;public:CH264_RTP_PACK(unsignedlongH264SSRC,unsignedcharH264PAYLOADTYPE=96,unsignedshortMAXRTPPACKSIZE=1472)m_MAXRTPPACKSIZE=MAXRTPPACKSIZE;if(m_MAXRTPPACKSIZE10000)m_MAXRTPPACKSIZE=10000;if(m_MAXRTPPACKSIZE50)m_MAXRTPPACKSIZE=50;memset(&m_RTP_Info,0,sizeof(m_RTP_Info);m_RTP_Info.rtp_hdr.pt=H264PAYLOADTYPE;m_RTP_Info.rtp_hdr.ssrc=H264SSRC;m_RTP_Info.rtp_hdr.v=RTP_VERSION;m_RTP_Info.rtp_hdr.seq=0;CH264_RTP_PACK(void)/传入Set的数据必须是一个完整的NAL,起始码为0x00000001。/起始码之前至少预留10个字节,以避免内存COPY操作。/打包完成后,原缓冲区内的数据被破坏。boolSet(unsignedchar*NAL_Buf,unsignedlongNAL_Size,unsignedlongTime_Stamp,boolEnd_Of_Frame)unsignedlongstartcode=StartCode(NAL_Buf);if(startcode!=0x01000000)returnfalse;inttype=NAL_Buf4&0x1f;if(type12)returnfalse;m_RTP_Info.nal.start=NAL_Buf;m_RTP_Info.nal.size=NAL_Size;m_RTP_Info.nal.eoFrame=End_Of_Frame;m_RTP_Info.nal.type=m_RTP_Info.nal.start4;m_RTP_Info.nal.end=m_RTP_Info.nal.start+m_RTP_Info.nal.size;m_RTP_Info.rtp_hdr.ts=Time_Stamp;m_RTP_Info.nal.start+=4;/skipthesyncwordif(m_RTP_Info.nal.size+7)m_MAXRTPPACKSIZE)m_RTP_Info.FU_flag=true;m_RTP_Info.s_bit=1;m_RTP_Info.e_bit=0;m_RTP_Info.nal.start+=1;/skipNALheaderelsem_RTP_Info.FU_flag=false;m_RTP_Info.s_bit=m_RTP_Info.e_bit=0;m_RTP_Info.start=m_RTP_Info.end=m_RTP_Info.nal.start;m_bBeginNAL=true;returntrue;/循环调用Get获取RTP包,直到返回值为NULLunsignedchar*Get(unsignedshort*pPacketSize)if(m_RTP_Info.end=m_RTP_Info.nal.end)*pPacketSize=0;returnNULL;if(m_bBeginNAL)m_bBeginNAL=false;elsem_RTP_Info.start=m_RTP_Info.end;/continuewiththenextRTP-FUpacketintbytesLeft=m_RTP_Info.nal.end-m_RTP_Info.start;intmaxSize=m_MAXRTPPACKSIZE-12; /sizeof(basicrtpheader)=12bytesif(m_RTP_Info.FU_flag)maxSize-=2;if(bytesLeftmaxSize)/ limit RTP packetsize to 1472 bytesm_RTP_Info.end=m_RTP_Info.start+maxSize;elsem_RTP_Info.end=m_RTP_Info.start+bytesLeft;if(m_RTP_Info.FU_flag)/multiplepacketNALsliceif(m_RTP_Info.end=m_RTP_Info.nal.end)m_RTP_Info.e_bit=1;/ should be set at EofFramem_RTP_Info.rtp_hdr.m=m_RTP_Info.nal.eoFrame?1:0;if(m_RTP_Info.FU_flag&!m_RTP_Info.e_bit) m_RTP_Info.rtp_hdr.m=0;m_RTP_Info.rtp_hdr.seq+;unsignedchar*cp=m_RTP_Info.start;cp-=(m_RTP_Info.FU_flag?14:12);m_RTP_Info.pRTP=cp;unsignedchar*cp2=(unsignedchar*)&m_RTP_Info.rtp_hdr;cp0=cp20;cp1=cp21;cp2=(m_RTP_Info.rtp_hdr.seq8)&0xff;cp3=m_RTP_Info.rtp_hdr.seq&0xff;cp4=(m_RTP_Info.rtp_hdr.ts24)&0xff;cp5=(m_RTP_Info.rtp_hdr.ts16)&0xff;cp6=(m_RTP_Info.rtp_hdr.ts8)&0xff;cp7=m_RTP_Info.rtp_hdr.ts&0xff;cp8=(m_RTP_Info.rtp_hdr.ssrc24)&0xff;cp9=(m_RTP_Info.rtp_hdr.ssrc16)&0xff;cp10=(m_RTP_Info.rtp_hdr.ssrc8)&0xff;cp11=m_RTP_Info.rtp_hdr.ssrc&0xff;m_RTP_Info.hdr_len=12;/*!*nTheFUindicatoroctethasthefollowingformat:*n*n+-+*nMSB|0|1|2|3|4|5|6|7|LSB*n+-+-+-+-+-+-+-+-+*n|F|NRI|Type|*n+-+*n*nTheFUheaderhasthefollowingformat:*n*n+-+*n|0|1|2|3|4|5|6|7|*n+-+-+-+-+-+-+-+-+*n|S|E|R|Type|*n+-+*/if(m_RTP_Info.FU_flag)/FUindicatorF|NRI|Typecp12=(m_RTP_Info.nal.type&0xe0)|28;/Typeis28forFU_A/FUheaderS|E|R|Typecp13=(m_RTP_Info.s_bit7)|(m_RTP_Info.e_bit6)|(m_RTP_Info.nal.type&0x1f);/R=0,mustbeignoredbyreceiverm_RTP_Info.s_bit=m_RTP_Info.e_bit=0;m_RTP_Info.hdr_len=14;m_RTP_Info.start=&cpm_RTP_Info.hdr_len;/newstartofpayload*pPacketSize=m_RTP_Info.hdr_len+(m_RTP_Info.end-m_RTP_Info.start);returnm_RTP_Info.pRTP;private:unsignedintStartCode(unsignedchar*cp)unsignedintd32;d32=cp3;d32=8;d32|=cp2;d32=8;d32|=cp1;d32=8;d32|=cp0;returnd32;private:RTP_INFOm_RTP_Info;boolm_bBeginNAL;unsignedshortm_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论