資源簡介
基于H.265的RTP封裝。
代碼片段和文件信息
#include?“StdAfx.h“
#include?“h265rtpsv.h“
#include?
#pragma?comment(lib?“ws2_32.lib“)
h265rtpsv::h265rtpsv(void)
{
m_maxpayloadsize?=?1440;
m_mode?=?PACK_MODE_RTPPAYLOAD;
m_current_ts?=?0;/*or?some?random?value*/
m_last_seq?=?0;
m_aps_allowed?=?FALSE;
m_pNaluBuf?=?NULL;
m_pNaluBufItertor?=?NULL;
m_uNaluBufSize?=?0;
m_uNaluDataLen?=?0;
m_bframeEndInNaluBuf?=?FALSE;
m_pRtpBuf?=?NULL;
m_pRtpBufItertor?=?NULL;
m_uRtpBufSize?=?0;
m_uRtpDataLen?=?0;
m_uNaluCountInRtpBuf?=?0;
????//m_cLowestlayerId?=?0;
????//m_cLowestTId?=?0;
}
h265rtpsv::~h265rtpsv(void)
{
if?(m_pNaluBuf)
{
delete?[]?m_pNaluBuf;
m_pNaluBuf?=?NULL;
}
if?(m_pRtpBuf)
{
delete?[]?m_pRtpBuf;
m_pRtpBuf?=?NULL;
}
}
void?h265rtpsv::SetMaxPayloadSize(?unsigned?int?size?)
{
m_maxpayloadsize?=?size;
}
void?h265rtpsv::SetMode(?int?mode/*?PACK_MODE_RAW?or?PACK_MODE_3984?*/?)
{
m_mode?=?mode;
}
void?h265rtpsv::EnableAPs(?BOOL?yesno?)
{
m_aps_allowed?=?yesno;
}
void?h265rtpsv::Reset()
{
TRACE(“h265rtpsv::Reset!\n“);
m_current_ts?=?0;
m_last_seq?=?0;
m_uNaluDataLen?=?0;
m_uRtpDataLen?=?0;
m_bframeEndInNaluBuf?=?FALSE;
m_pNaluBufItertor?=?NULL;
m_pRtpBufItertor?=?NULL;
????m_uNaluCountInRtpBuf?=?0;
????//m_cLowestlayerId?=?0;
????//m_cLowestTId?=?0;
}
/*process?NALUs?and?pack?them?into?rtp?payloads?*/
BOOL?h265rtpsv::InputNalu(?const?char*?nalu?unsigned?long?nlen?BOOL?frameend
??char*&?pl?unsigned?long&?plen?BOOL&?bMark?BOOL&?bHavemore?)
{
pl?=?NULL;
plen?=?0;
bMark?=?FALSE;
bHavemore?=?FALSE;
switch(m_mode)
{
case?PACK_MODE_RAW_H265:
{?//?do?nothing?but?a?check
if?(!nalu)
return?FALSE;
char*?raw?=?(char*)nalu;
unsigned?long?rawlen?=?nlen;
if?(rawlen?>?4)
{
if?(memcmp(raw?NALU_STARTBYTES32?4)?==?0)
{
raw?+=?4;
rawlen?-=?4;
}
else?if?(memcmp(raw?NALU_STARTBYTES24?3)?==?0)
{
raw?+=?3;
rawlen?-=?3;
}
}
if?(nlen?>?m_maxpayloadsize)
{
TRACE(“This?H264?packet?does?not?fit?into?mtu:?size=%i\n“?nlen);
return?FALSE;
}
pl?=?raw;
plen?=?rawlen;
bMark?=?frameend;
bHavemore?=?FALSE;
return?TRUE;
}
break;
case?PACK_MODE_RTPPAYLOAD:
{?//?do?pack
char*?raw?=?(char*)nalu;
unsigned?long?rawlen?=?nlen;
if?(!raw)
{
raw?=?m_pNaluBuf;
rawlen?=?m_uNaluDataLen;
if?(!raw)
{
return?FALSE;
}
}
else
{
m_uNaluDataLen?=?0;
m_pNaluBufItertor?=?NULL;
}
if?(rawlen?>?4)
{
if?(memcmp(raw?NALU_STARTBYTES32?4)?==?0)
{
raw?+=?4;
rawlen?-=?4;
}
else?if?(memcmp(raw?NALU_STARTBYTES24?3)?==?0)
{
raw?+=?3;
rawlen?-=?3;
}
}
if?(m_aps_allowed)
{
if?(m_uRtpDataLen?>?0)
{
if?(m_uRtpDataLen+rawlen+2? {
unsigned?short?size?=?hto
評(píng)論
共有 條評(píng)論