H264流拆包

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;
}
== 这是具体拆法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值