資源簡介
H264 封包解包 CH264_RTP_PACK
代碼片段和文件信息
//
//?class?CH264_RTP_PACK?start
class?CH264_RTP_PACK
{
#define?RTP_VERSION?2
typedef?struct?NAL_msg_s?
{
bool?eoframe?;
unsigned?char?type; //?NAL?type
unsigned?char?*start; //?pointer?to?first?location?in?the?send?buffer
unsigned?char?*end; //?pointer?to?last?location?in?send?buffer
unsigned?long?size?;
}?NAL_MSG_t;
typedef?struct?
{
//LITTLE_ENDIAN
unsigned?short???cc:4; /*?CSRC?count?????????????????*/
unsigned?short???x:1; /*?header?extension?flag??????*/
unsigned?short???p:1; /*?padding?flag???????????????*/
unsigned?short???v:2; /*?packet?type????????????????*/
unsigned?short???pt:7; /*?payload?type???????????????*/
unsigned?short???m:1; /*?marker?bit?????????????????*/
unsigned?short????seq; /*?sequence?number????????????*/
unsigned?long?????ts; /*?timestamp??????????????????*/
unsigned?long?????ssrc; /*?synchronization?source?????*/
}?rtp_hdr_t;
typedef?struct?tagRTP_INFO
{
NAL_MSG_t nal; ????//?NAL?information
rtp_hdr_t rtp_hdr;????//?RTP?header?is?assembled?here
int?hdr_len; //?length?of?RTP?header
unsigned?char?*pRTP;????//?pointer?to?where?RTP?packet?has?beem?assembled
unsigned?char?*start; //?pointer?to?start?of?payload
unsigned?char?*end; //?pointer?to?end?of?payload
unsigned?int?s_bit; //?bit?in?the?FU?header
unsigned?int?e_bit; //?bit?in?the?FU?header
bool?FU_flag; //?fragmented?NAL?Unit?flag
}?RTP_INFO;
public:
CH264_RTP_PACK(unsigned?long?H264SSRC?unsigned?char?H264PAYLOADTYPE=96?unsigned?short?MAXRTPPACKSIZE=1472?)
{
m_MAXRTPPACKSIZE?=?MAXRTPPACKSIZE?;
if?(?m_MAXRTPPACKSIZE?>?10000?)
{
m_MAXRTPPACKSIZE?=?10000?;
}
if?(?m_MAXRTPPACKSIZE?50?)
{
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的數(shù)據(jù)必須是一個完整的NAL起始碼為0x00000001。
//起始碼之前至少預(yù)留10個字節(jié),以避免內(nèi)存COPY操作。
//打包完成后,原緩沖區(qū)內(nèi)的數(shù)據(jù)被破壞。
bool?Set?(?unsigned?char?*NAL_Buf?unsigned?long?NAL_Size?unsigned?long?Time_Stamp?bool?End_Of_frame?)
{
unsigned?long?startcode?=?StartCode(NAL_Buf)?;
if?(?startcode?!=?0x01000000?)
{
return?false?;
}
int?type?=?NAL_Buf[4]?&?0x1f?;
if?(?type?1?||?type?>?12?)
{
return?false?;
}
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.start[4]?;
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?; //?skip?the?syncword
if?(?(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?; //?skip?NAL?header
評論
共有 條評論