资源简介
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的数据必须是一个完整的NAL起始码为0x00000001。
//起始码之前至少预留10个字节,以避免内存COPY操作。
//打包完成后,原缓冲区内的数据被破坏。
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
- 上一篇:H.264标准详细图解
- 下一篇:TCP/IP与串口调试
相关资源
- Microsoft Visual C++ 2005 Redistributable Pack
- Microsoft Visual C++ 2010 Redistributable Pack
- H264转化MP4源码
- c++使用ffmpeg把h264/h265和mp3写入mp4文件
- C H264格式 转MP4格式
- H264 转 YUV
- Microsoft Visual C++ 2005 SP1 Redistributable
- Microsoft Visual C++ 2010 SP1 Redistributable
- 使用JRTPLib基于RTP协议服务器与客户端
- WinPcap 4.0.1和WpdPack 4.0.1
- Microsoft Visual C++ 2005 Redistributable Pack
- SQL server compact 3.5
- Linux下C语言FLV文件拆解成h264视频流和
- Apache2.2-win32-x86
- Microsoft Visual C++ 2013 Redistributable Pack
- VC H264格式视屏播放器源码
- Microsoft Visual C++ 2008 SP1 Redistributable
- Microsoft Visual C++ 2008 SP1 Redistributable
- 开源H.264码流分析器程序+源代码
- HaRepackerEX5
- winPcap4.0.1以及程序员开发包Wpdpack
- 基于funcode的吃豆人小游戏
- C++ 解析H264文件
- 把H264和音频流打包成PS流
- H264 TS打包C语言源代码
- linux系统C语言AVI格式音视频封装应用
- Microsoft Visual C++ 2013 Redistributable Pack
- Linux(CentOS6.5) 安装Oracle11g所需安装
- 使用RTP协议发送和接收H264的(支持解
- RTSP PUSH tcp udp h264 easydarwin
评论
共有 条评论