http://blog.sina.com.cn/s/blog_5dfd44300100heb5.html
UINT MediaStreamH264::TransportH264Nal(const PBYTE pNal, UINTnalSize, INT32 pts, BOOL isLast)
{
ATLock atlock(&m_tlockRun);
if (m_bRun == FALSE)
return 0;
if( nalSize < 5 )
return 0;
UINT mtu = m_nMTU;
const int i_max = mtu - RTP_HEADER_SIZE;
int i_nal_hdr;
int i_nal_type;
i_nal_hdr = pNal[3];
i_nal_type =i_nal_hdr&0x1f;
string sps;
string pps;
if( i_nal_type == 7 || i_nal_type == 8 )
{
return 0;
}
PBYTE p_data = pNal;
int i_data = nalSize;
p_data += 3;
i_data -= 3;
int writeSize = 0;
if( i_data <= i_max )
{
//writeSize =m_pRtpTransport->SetRtpData(p_data, i_data, pts,isLast);
writeSize =m_pRtpTransport->Write(p_data, i_data,m_nRtpPayloadType, pts, 0, isLast);
if (writeSize <=0)
return0;
return writeSize;
}
else
{
const int i_count = ( i_data-1+ i_max-2 - 1 ) / (i_max-2);
int i;
p_data++;
i_data--;
for( i = 0; i< i_count; i++ )
{
const inti_payload = (i_data < (i_max-2)) ?i_data : (i_max-2);
const intnalSize = 2 + i_payload;
m_Packet.ExtendBuffer(nalSize);
m_Packet.m_pData[0]= 0x00 | (i_nal_hdr & 0x60) | 28;
m_Packet.m_pData[1]= ( i == 0 ? 0x80 : 0x00 ) | ( (i == i_count-1) ? 0x40 : 0x00) | i_nal_type;
memcpy(&m_Packet.m_pData[2], p_data, i_payload );
m_Packet.m_DataSize= nalSize;
//intiWrite =m_pRtpTransport->SetRtpData(m_Packet.m_pData,m_Packet.m_DataSize, pts, isLast &&(i == i_count-1));
int iWrite =m_pRtpTransport->Write(m_Packet.m_pData,m_Packet.m_DataSize, m_nRtpPayloadType, pts, 0, isLast&& (i == i_count-1));
if (iWrite> 0)
writeSize+= iWrite;
i_data -=i_payload;
p_data +=i_payload;
}
}
return writeSize;
}
== 这是具体拆法