1 /** 2 * @file re_rtp.h Interface to Real-time Transport Protocol and RTCP 3 * 4 * Copyright (C) 2010 Creytiv.com 5 */ 6 7 8 /** RTP protocol values */ 9 enum { 10 RTP_VERSION = 2, /**< Defines the RTP version we support */ 11 RTCP_VERSION = 2, /**< Supported RTCP Version */ 12 RTP_HEADER_SIZE = 12 /**< Number of bytes in RTP Header */ 13 }; 14 15 16 /** Defines the RTP header */ 17 struct rtp_header { 18 uint8_t ver; /**< RTP version number */ 19 bool pad; /**< Padding bit */ 20 bool ext; /**< Extension bit */ 21 uint8_t cc; /**< CSRC count */ 22 bool m; /**< Marker bit */ 23 uint8_t pt; /**< Payload type */ 24 uint16_t seq; /**< Sequence number */ 25 uint32_t ts; /**< Timestamp */ 26 uint32_t ssrc; /**< Synchronization source */ 27 uint32_t csrc[16]; /**< Contributing sources */ 28 struct { 29 uint16_t type; /**< Defined by profile */ 30 uint16_t len; /**< Number of 32-bit words */ 31 } x; 32 }; 33 34 /** RTCP Packet Types */ 35 enum rtcp_type { 36 RTCP_FIR = 192, /**< Full INTRA-frame Request (RFC 2032) */ 37 RTCP_NACK = 193, /**< Negative Acknowledgement (RFC 2032) */ 38 RTCP_SR = 200, /**< Sender Report */ 39 RTCP_RR = 201, /**< Receiver Report */ 40 RTCP_SDES = 202, /**< Source Description */ 41 RTCP_BYE = 203, /**< Goodbye */ 42 RTCP_APP = 204, /**< Application-defined */ 43 RTCP_RTPFB = 205, /**< Transport layer FB message (RFC 4585) */ 44 RTCP_PSFB = 206, /**< Payload-specific FB message (RFC 4585) */ 45 RTCP_XR = 207, /**< Extended Report (RFC 3611) */ 46 RTCP_AVB = 208, /**< AVB RTCP Packet (IEEE1733) */ 47 }; 48 49 /** SDES Types */ 50 enum rtcp_sdes_type { 51 RTCP_SDES_END = 0, /**< End of SDES list */ 52 RTCP_SDES_CNAME = 1, /**< Canonical name */ 53 RTCP_SDES_NAME = 2, /**< User name */ 54 RTCP_SDES_EMAIL = 3, /**< User's electronic mail address */ 55 RTCP_SDES_PHONE = 4, /**< User's phone number */ 56 RTCP_SDES_LOC = 5, /**< Geographic user location */ 57 RTCP_SDES_TOOL = 6, /**< Name of application or tool */ 58 RTCP_SDES_NOTE = 7, /**< Notice about the source */ 59 RTCP_SDES_PRIV = 8 /**< Private extension */ 60 }; 61 62 /** Transport Layer Feedback Messages */ 63 enum rtcp_rtpfb { 64 RTCP_RTPFB_GNACK = 1 /**< Generic NACK */ 65 }; 66 67 /** Payload-Specific Feedback Messages */ 68 enum rtcp_psfb { 69 RTCP_PSFB_PLI = 1, /**< Picture Loss Indication (PLI) */ 70 RTCP_PSFB_SLI = 2, /**< Slice Loss Indication (SLI) */ 71 RTCP_PSFB_AFB = 15, /**< Application layer Feedback Messages */ 72 }; 73 74 /** Reception report block */ 75 struct rtcp_rr { 76 uint32_t ssrc; /**< Data source being reported */ 77 unsigned int fraction:8; /**< Fraction lost since last SR/RR */ 78 int lost:24; /**< Cumul. no. pkts lost (signed!) */ 79 uint32_t last_seq; /**< Extended last seq. no. received */ 80 uint32_t jitter; /**< Interarrival jitter */ 81 uint32_t lsr; /**< Last SR packet from this source */ 82 uint32_t dlsr; /**< Delay since last SR packet */ 83 }; 84 85 /** SDES item */ 86 struct rtcp_sdes_item { 87 enum rtcp_sdes_type type; /**< Type of item (enum rtcp_sdes_type) */ 88 uint8_t length; /**< Length of item (in octets) */ 89 char *data; /**< Text, not null-terminated */ 90 }; 91 92 /** One RTCP Message */ 93 struct rtcp_msg { 94 /** RTCP Header */ 95 struct rtcp_hdr { 96 unsigned int version:2; /**< Protocol version */ 97 unsigned int p:1; /**< Padding flag */ 98 unsigned int count:5; /**< Varies by packet type */ 99 unsigned int pt:8; /**< RTCP packet type */ 100 uint16_t length; /**< Packet length in words */ 101 } hdr; 102 union { 103 /** Sender report (SR) */ 104 struct { 105 uint32_t ssrc; /**< Sender generating report */ 106 uint32_t ntp_sec; /**< NTP timestamp - seconds */ 107 uint32_t ntp_frac; /**< NTP timestamp - fractions */ 108 uint32_t rtp_ts; /**< RTP timestamp */ 109 uint32_t psent; /**< RTP packets sent */ 110 uint32_t osent; /**< RTP octets sent */ 111 struct rtcp_rr *rrv; /**< Reception report blocks */ 112 } sr; 113 114 /** Reception report (RR) */ 115 struct { 116 uint32_t ssrc; /**< Receiver generating report*/ 117 struct rtcp_rr *rrv; /**< Reception report blocks */ 118 } rr; 119 120 /** Source Description (SDES) */ 121 struct rtcp_sdes { 122 uint32_t src; /**< First SSRC/CSRC */ 123 struct rtcp_sdes_item *itemv; /**< SDES items */ 124 uint32_t n; /**< Number of SDES items */ 125 } *sdesv; 126 127 /** BYE */ 128 struct { 129 uint32_t *srcv; /**< List of sources */ 130 char *reason; /**< Reason for leaving (opt.) */ 131 } bye; 132 133 /** Application-defined (APP) */ 134 struct { 135 uint32_t src; /**< SSRC/CSRC */ 136 char name[4]; /**< Name (ASCII) */ 137 uint8_t *data; /**< Application data (32 bits) */ 138 size_t data_len; /**< Number of data bytes */ 139 } app; 140 141 /** Full INTRA-frame Request (FIR) packet */ 142 struct { 143 uint32_t ssrc; /**< SSRC for sender of this packet */ 144 } fir; 145 146 /** Negative ACKnowledgements (NACK) packet */ 147 struct { 148 uint32_t ssrc; /**< SSRC for sender of this packet */ 149 uint16_t fsn; /**< First Sequence Number lost */ 150 uint16_t blp; /**< Bitmask of lost packets */ 151 } nack; 152 153 /** Feedback (RTPFB or PSFB) packet */ 154 struct { 155 uint32_t ssrc_packet; 156 uint32_t ssrc_media; 157 uint32_t n; 158 /** Feedback Control Information (FCI) */ 159 union { 160 struct gnack { 161 uint16_t pid; 162 uint16_t blp; 163 } *gnackv; 164 struct sli { 165 uint16_t first; 166 uint16_t number; 167 uint8_t picid; 168 } *sliv; 169 struct mbuf *afb; 170 void *p; 171 } fci; 172 } fb; 173 } r; 174 }; 175 176 /** RTCP Statistics */ 177 struct rtcp_stats { 178 struct { 179 uint32_t sent; /**< Tx RTP Packets */ 180 int lost; /**< Tx RTP Packets Lost */ 181 uint32_t jit; /**< Tx Inter-arrival Jitter in [us] */ 182 } tx; 183 struct { 184 uint32_t sent; /**< Rx RTP Packets */ 185 int lost; /**< Rx RTP Packets Lost */ 186 uint32_t jit; /**< Rx Inter-Arrival Jitter in [us] */ 187 } rx; 188 uint32_t rtt; /**< Current Round-Trip Time in [us] */ 189 }; 190 191 struct sa; 192 struct re_printf; 193 struct rtp_sock; 194 195 typedef void (rtp_recv_h)(const struct sa *src, const struct rtp_header *hdr, 196 struct mbuf *mb, void *arg); 197 typedef void (rtcp_recv_h)(const struct sa *src, struct rtcp_msg *msg, 198 void *arg); 199 200 /* RTP api */ 201 int rtp_alloc(struct rtp_sock **rsp); 202 int rtp_listen(struct rtp_sock **rsp, int proto, const struct sa *ip, 203 uint16_t min_port, uint16_t max_port, bool enable_rtcp, 204 rtp_recv_h *recvh, rtcp_recv_h *rtcph, void *arg); 205 int rtp_hdr_encode(struct mbuf *mb, const struct rtp_header *hdr); 206 int rtp_hdr_decode(struct rtp_header *hdr, struct mbuf *mb); 207 int rtp_encode(struct rtp_sock *rs, bool ext, bool marker, uint8_t pt, 208 uint32_t ts, struct mbuf *mb); 209 int rtp_decode(struct rtp_sock *rs, struct mbuf *mb, struct rtp_header *hdr); 210 int rtp_send(struct rtp_sock *rs, const struct sa *dst, bool ext, 211 bool marker, uint8_t pt, uint32_t ts, struct mbuf *mb); 212 int rtp_debug(struct re_printf *pf, const struct rtp_sock *rs); 213 void *rtp_sock(const struct rtp_sock *rs); 214 uint32_t rtp_sess_ssrc(const struct rtp_sock *rs); 215 const struct sa *rtp_local(const struct rtp_sock *rs); 216 217 /* RTCP session api */ 218 void rtcp_start(struct rtp_sock *rs, const char *cname, 219 const struct sa *peer); 220 void rtcp_enable_mux(struct rtp_sock *rs, bool enabled); 221 void rtcp_set_srate(struct rtp_sock *rs, uint32_t sr_tx, uint32_t sr_rx); 222 void rtcp_set_srate_tx(struct rtp_sock *rs, uint32_t srate_tx); 223 void rtcp_set_srate_rx(struct rtp_sock *rs, uint32_t srate_rx); 224 int rtcp_send_app(struct rtp_sock *rs, const char name[4], 225 const uint8_t *data, size_t len); 226 int rtcp_send_fir(struct rtp_sock *rs, uint32_t ssrc); 227 int rtcp_send_nack(struct rtp_sock *rs, uint16_t fsn, uint16_t blp); 228 int rtcp_send_pli(struct rtp_sock *rs, uint32_t fb_ssrc); 229 int rtcp_debug(struct re_printf *pf, const struct rtp_sock *rs); 230 void *rtcp_sock(const struct rtp_sock *rs); 231 int rtcp_stats(struct rtp_sock *rs, uint32_t ssrc, struct rtcp_stats *stats); 232 233 /* RTCP utils */ 234 int rtcp_encode(struct mbuf *mb, enum rtcp_type type, uint32_t count, ...); 235 int rtcp_decode(struct rtcp_msg **msgp, struct mbuf *mb); 236 int rtcp_msg_print(struct re_printf *pf, const struct rtcp_msg *msg); 237 int rtcp_sdes_encode(struct mbuf *mb, uint32_t src, uint32_t itemc, ...); 238 const char *rtcp_type_name(enum rtcp_type type); 239 const char *rtcp_sdes_name(enum rtcp_sdes_type sdes); 240