⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtppkt.h

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 H
📖 第 1 页 / 共 2 页
字号:

HX_INLINE UINT8*
ReceptionReport::unpack(UINT8* buf, UINT32 len)
{
    if (!buf || !len)
	return 0;
    UINT8* off = buf;

    {
	ssrc = GetDwordFromBufAndInc(off);
    }
    {
	fraction  = *off++;
    }
    {
	lost  = *off++<<16;
	lost |= *off++<<8;
	lost |= *off++;
    }
    {
        last_seq = GetDwordFromBufAndInc(off);
    }
    {
        jitter = GetDwordFromBufAndInc(off);
    }
    {
	lsr = GetDwordFromBufAndInc(off);
    }
    {
	dlsr = GetDwordFromBufAndInc(off);
    }
    return off;
}

HX_INLINE UINT8*
SDESItem::pack(UINT8* buf, UINT32 &len)
{
    UINT8* off = buf;

    *off++ = sdes_type;
    if ((sdes_type != 0))
    {
      *off++ = length;
      {memcpy(off, data, length); off += length; } /* Flawfinder: ignore */
    }
    len = off-buf;
    return off;
}

HX_INLINE UINT8*
SDESItem::unpack(UINT8* buf, UINT32 len)
{
    if (!buf || !len)
	return 0;
    UINT8* off = buf;

    sdes_type = *off++;
    if ((sdes_type != 0))
    {
      length = *off++;
      if (off-buf+length > (int)len)
	  return 0;
      {data = (UINT8 *)off; off += length;}
    }
    return off;
}

HX_INLINE UINT8*
APPItem::pack(UINT8* buf, UINT32 &len)
{
    UINT8* off = buf;

    *off++ = app_type;
    if ((1 == app_type))
    {
      {
	  *off++ = (UINT8) (packet_sent);
      }
      {*off++ = (UINT8) (seq_no>>8); *off++ = (UINT8) (seq_no);}
      {
	  *off++ = (UINT8) (timestamp>>24); *off++ = (UINT8) (timestamp>>16); *off++ = (UINT8) (timestamp>>8); *off++ = (UINT8) (timestamp);
      }
    }
    if ((2 == app_type))
    {
      {
	  *off++ = (UINT8) (lowest_timestamp>>24); *off++ = (UINT8) (lowest_timestamp>>16); *off++ = (UINT8) (lowest_timestamp>>8); *off++ = (UINT8) (lowest_timestamp);
      }
      {
	  *off++ = (UINT8) (highest_timestamp>>24); *off++ = (UINT8) (highest_timestamp>>16); *off++ = (UINT8) (highest_timestamp>>8); *off++ = (UINT8) (highest_timestamp);
      }
      {
	  *off++ = (UINT8) (bytes_buffered>>24); *off++ = (UINT8) (bytes_buffered>>16); *off++ = (UINT8) (bytes_buffered>>8); *off++ = (UINT8) (bytes_buffered);
      }
      {
	  *off++ = (UINT8) (padding0>>16);
	  *off++ = (UINT8) (padding0>>8);
	  *off++ = (UINT8) (padding0);
      }
    }
    len = off-buf;
    return off;
}

HX_INLINE UINT8*
APPItem::unpack(UINT8* buf, UINT32 len)
{
    if (!buf || !len)
	return 0;
    UINT8* off = buf;

    app_type = *off++;
    if ((1 == app_type))
    {
      {
	  packet_sent  = *off++;
      }
      {seq_no = *off++<<8; seq_no |= *off++;}
      {
	  timestamp = GetDwordFromBufAndInc(off);
      }
    }
    if ((2 == app_type))
    {
      {
	  lowest_timestamp = GetDwordFromBufAndInc(off);
      }
      {
	  highest_timestamp = GetDwordFromBufAndInc(off);
      }
      {
	  bytes_buffered = GetDwordFromBufAndInc(off);
      }
      {
	  padding0  = *off++<<16;
	  padding0 |= *off++<<8;
	  padding0 |= *off++;
      }
    }
    return off;
}

HX_INLINE UINT8*
RTCPPacketBase::pack(UINT8* buf, UINT32 &len)
{
    UINT8* off = buf;

    {
	*off &= ~0xc0; *off |= (version_flag&0x3)<<6;
    }
    {*off &= ~(1<<5); *off |= (padding_flag&1)<<5;}
    {
	*off &= ~0x1f; *off++ |= count&0x1f;
    }
    {
	*off++ = (UINT8) (packet_type);
    }
    {*off++ = (UINT8) (length>>8); *off++ = (UINT8) (length);}
    if ((packet_type == 200))
    {
      {
	  *off++ = (UINT8) (sr_ssrc>>24); *off++ = (UINT8) (sr_ssrc>>16); *off++ = (UINT8) (sr_ssrc>>8); *off++ = (UINT8) (sr_ssrc);
      }
      {
	  *off++ = (UINT8) (ntp_sec>>24); *off++ = (UINT8) (ntp_sec>>16); *off++ = (UINT8) (ntp_sec>>8); *off++ = (UINT8) (ntp_sec);
      }
      {
	  *off++ = (UINT8) (ntp_frac>>24); *off++ = (UINT8) (ntp_frac>>16); *off++ = (UINT8) (ntp_frac>>8); *off++ = (UINT8) (ntp_frac);
      }
      {
	  *off++ = (UINT8) (rtp_ts>>24); *off++ = (UINT8) (rtp_ts>>16); *off++ = (UINT8) (rtp_ts>>8); *off++ = (UINT8) (rtp_ts);
      }
      {
	  *off++ = (UINT8) (psent>>24); *off++ = (UINT8) (psent>>16); *off++ = (UINT8) (psent>>8); *off++ = (UINT8) (psent);
      }
      {
	  *off++ = (UINT8) (osent>>24); *off++ = (UINT8) (osent>>16); *off++ = (UINT8) (osent>>8); *off++ = (UINT8) (osent);
      }
      {for (int i = 0;  i < count; i++)
	  off = sr_data[i].pack(off, len);
      }
    }
    if ((packet_type == 201))
    {
      {
	  *off++ = (UINT8) (rr_ssrc>>24); *off++ = (UINT8) (rr_ssrc>>16); *off++ = (UINT8) (rr_ssrc>>8); *off++ = (UINT8) (rr_ssrc);
      }
      {for (int i = 0;  i < count; i++)
	  off = rr_data[i].pack(off, len);
      }
    }
    if ((packet_type == 202))
    {
      {memcpy(off, sdes_data, (length * 4)); off += (length * 4); } /* Flawfinder: ignore */
    }
    if ((packet_type == 203))
    {
      {for (int i = 0;  i < count; i++)
	  {
	      *off++ = (UINT8) (bye_src[i]>>24); *off++ = (UINT8) (bye_src[i]>>16); *off++ = (UINT8) (bye_src[i]>>8); *off++ = (UINT8) (bye_src[i]);
	  }
      }
    }
    if ((packet_type == 204))
    {
      {
	  *off++ = (UINT8) (app_ssrc>>24); *off++ = (UINT8) (app_ssrc>>16); *off++ = (UINT8) (app_ssrc>>8); *off++ = (UINT8) (app_ssrc);
      }
      {memcpy(off, app_name, 4); off += 4; } /* Flawfinder: ignore */
      {memcpy(off, app_data, ((length - 2) * 4)); off += ((length - 2) * 4); } /* Flawfinder: ignore */
    }
    len = off-buf;
    return off;
}

HX_INLINE UINT8*
RTCPPacketBase::unpack(UINT8* buf, UINT32 len)
{
    if (!buf || len < 4)
	return 0;
    UINT8* off = buf;

    {
	version_flag  = (*off&0xc0)>>6;
    }
    padding_flag = (*off>>5)&1;
    {
	count  = *off++&0x1f;
    }
    {
	packet_type  = *off++;
    }
    {length = *off++<<8; length |= *off++;}

    if (len < (UINT32)4*(length + 1))
    {
        count = 0;
        return 0;
    }

    if ((packet_type == 200))
    {
        if (length < 6)
        {
            count = 0;
            return buf + 4 + 4*length;
        }
      {
	  sr_ssrc = GetDwordFromBufAndInc(off);
      }
      {
	  ntp_sec = GetDwordFromBufAndInc(off);
      }
      {
	  ntp_frac = GetDwordFromBufAndInc(off);
      }
      {
	  rtp_ts = GetDwordFromBufAndInc(off);
      }
      {
	  psent = GetDwordFromBufAndInc(off);
      }
      {
	  osent = GetDwordFromBufAndInc(off);
      }
      if (length < 6 + count*(ReceptionReport::static_size() / 4))
      {
          count = 0;
          return buf + 4 + length*4;
      }
      {
	  sr_data = new ReceptionReport[count];
	  for (int i = 0;  i < count; i++)
	  off = sr_data[i].unpack(off, len);
      }
    }
    if ((packet_type == 201))
    {
        if (length < 1)
        {
            count = 0;
            return buf + 4 + 4*length;
        }
      {
	  rr_ssrc = GetDwordFromBufAndInc(off);
      }
        if (length < 1 + count*(ReceptionReport::static_size() / 4))
        {
            count = 0;
            return buf + 4 + length*4;
        }
      {
	  rr_data = new ReceptionReport[count];
	  for (int i = 0;  i < count; i++)
	  off = rr_data[i].unpack(off, len);
      }
    }
    if ((packet_type == 202))
    {
      if (off-buf+(length * 4) > (int)len)
	  return 0;
      {sdes_data = (UINT8 *)off; off += (length * 4);}
    }
    if ((packet_type == 203))
    {
        if (length < count)
        {
            count = 0;
            return buf + 4 + length*4;
        }
      {
	  bye_src = new UINT32[count];
	  for (int i = 0;  i < count; i++)
	  {
	      bye_src[i] = GetDwordFromBufAndInc(off);
	  }
      }
    }
    if ((packet_type == 204))
    {
      {
	  app_ssrc = GetDwordFromBufAndInc(off);
      }
      if (off-buf+4 > (int)len)
	  return 0;
      {memcpy(app_name, off, 4); off += 4; } /* Flawfinder: ignore */
      if (off-buf+((length - 2) * 4) > (int)len)
	  return 0;
      {app_data = (UINT8 *)off; off += ((length - 2) * 4);}
    }
    return off;
}

#endif //_DEFINE_INLINE

#endif /* _RTPPKT_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -