Browse Source

improve RTP support

master
Christophe Massiot 11 years ago
parent
commit
b089bde04e
1 changed files with 64 additions and 5 deletions
  1. +64
    -5
      ietf/rtp.h

+ 64
- 5
ietf/rtp.h View File

@ -1,7 +1,7 @@
/*****************************************************************************
* rtp.h: Real-time Transport Protocol
*****************************************************************************
* Copyright (C) 2009 VideoLAN
* Copyright (C) 2009, 2014 VideoLAN
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
@ -42,6 +42,7 @@ extern "C"
#endif
#define RTP_HEADER_SIZE 12
#define RTP_EXTENSION_SIZE 4
#define RTP_TYPE_TS 33
/*
@ -70,9 +71,40 @@ static inline bool rtp_check_hdr(const uint8_t *p_rtp)
return (p_rtp[0] & 0xc0) == 0x80;
}
static inline void rtp_set_extension(uint8_t *p_rtp)
{
p_rtp[0] |= 0x10;
}
static inline bool rtp_check_extension(const uint8_t *p_rtp)
{
return !!(p_rtp[0] & 0x10);
}
static inline void rtp_set_cc(uint8_t *p_rtp, uint8_t i_cc)
{
p_rtp[0] &= 0xf0;
p_rtp[0] |= i_cc & 0xf;
}
static inline uint8_t rtp_get_cc(const uint8_t *p_rtp)
{
return p_rtp[0] & 0xf;
}
static inline void rtp_set_marker(uint8_t *p_rtp)
{
p_rtp[1] |= 0x80;
}
static inline bool rtp_check_marker(const uint8_t *p_rtp)
{
return !!(p_rtp[1] & 0x80);
}
static inline void rtp_set_type(uint8_t *p_rtp, uint8_t i_type)
{
p_rtp[1] = i_type;
p_rtp[1] = i_type & 0x7f;
}
static inline uint8_t rtp_get_type(const uint8_t *p_rtp)
@ -120,12 +152,39 @@ static inline void rtp_get_ssrc(const uint8_t *p_rtp, uint8_t pi_ssrc[4])
pi_ssrc[3] = p_rtp[11];
}
static inline uint8_t *rtp_extension(uint8_t *p_rtp)
{
return p_rtp + RTP_HEADER_SIZE + 4 * rtp_get_cc(p_rtp);
}
static inline void rtpx_set_header(uint8_t *p_rtpx, uint16_t i_header)
{
p_rtpx[0] = (i_header >> 8) & 0xff;
p_rtpx[1] = i_header & 0xff;
}
static inline uint16_t rtpx_get_header(const uint8_t *p_rtpx)
{
return (p_rtpx[0] << 8) | p_rtpx[1];
}
static inline void rtpx_set_length(uint8_t *p_rtpx, uint16_t i_length)
{
p_rtpx[2] = (i_length >> 8) & 0xff;
p_rtpx[3] = i_length & 0xff;
}
static inline uint16_t rtpx_get_length(const uint8_t *p_rtpx)
{
return (p_rtpx[2] << 8) | p_rtpx[3];
}
static inline uint8_t *rtp_payload(uint8_t *p_rtp)
{
unsigned int i_size = RTP_HEADER_SIZE;
i_size += 4 * (p_rtp[0] & 0xf);
if (p_rtp[0] & 0x10) /* header extension */
i_size += 4 * (1 + (p_rtp[i_size + 2] << 8) + p_rtp[i_size + 3]);
i_size += 4 * rtp_get_cc(p_rtp);
if (rtp_check_extension(p_rtp))
i_size += 4 * (1 + rtpx_get_length(rtp_extension(p_rtp)));
return p_rtp + i_size;
}

Loading…
Cancel
Save