• 大小: 4KB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2021-06-13
  • 语言: 其他
  • 标签: H.265  RTP  

资源简介

基于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 < m_maxpayloadsize)
{
unsigned short size = hto

评论

共有 条评论