James Kuszmaul | 82f6c04 | 2021-01-17 11:30:16 -0800 | [diff] [blame^] | 1 | /** |
| 2 | * @file rtcp.h Internal interface to RTCP |
| 3 | * |
| 4 | * Copyright (C) 2010 Creytiv.com |
| 5 | */ |
| 6 | |
| 7 | |
| 8 | /** RTCP protocol values */ |
| 9 | enum { |
| 10 | RTCP_HDR_SIZE = 4, /**< Size of common RTCP header */ |
| 11 | RTCP_SRC_SIZE = 4, /**< Size of Source field */ |
| 12 | RTCP_SR_SIZE = 20, /**< Size of Sender Information */ |
| 13 | RTCP_RR_SIZE = 24, /**< Size of Report Block */ |
| 14 | RTCP_APP_SIZE = 8, /**< Size of Application packet */ |
| 15 | RTCP_FIR_SIZE = 4, /**< Size of FIR packet */ |
| 16 | RTCP_NACK_SIZE = 8, /**< Size of NACK packet */ |
| 17 | RTCP_FB_SIZE = 8, /**< Size of Feedback packets */ |
| 18 | RTCP_MAX_SDES = 255, /**< Maximum text length for SDES */ |
| 19 | RTCP_HEADROOM = 4, /**< Headroom in RTCP packets */ |
| 20 | }; |
| 21 | |
| 22 | /** NTP Time */ |
| 23 | struct ntp_time { |
| 24 | uint32_t hi; /**< Seconds since 0h UTC on 1 January 1900 */ |
| 25 | uint32_t lo; /**< Fraction of seconds */ |
| 26 | }; |
| 27 | |
| 28 | struct hash; |
| 29 | |
| 30 | /** Per-source state information */ |
| 31 | struct rtp_source { |
| 32 | struct sa rtp_peer; /**< IP-address of the RTP source */ |
| 33 | uint16_t max_seq; /**< Highest seq. number seen */ |
| 34 | uint32_t cycles; /**< Shifted count of seq. number cycles */ |
| 35 | uint32_t base_seq; /**< Base seq number */ |
| 36 | uint32_t bad_seq; /**< Last 'bad' seq number + 1 */ |
| 37 | uint32_t probation; /**< Sequ. packets till source is valid */ |
| 38 | uint32_t received; /**< Packets received */ |
| 39 | uint32_t expected_prior; /**< Packet expected at last interval */ |
| 40 | uint32_t received_prior; /**< Packet received at last interval */ |
| 41 | int transit; /**< Relative trans time for prev pkt */ |
| 42 | uint32_t jitter; /**< Estimated jitter */ |
| 43 | size_t rtp_rx_bytes; /**< Number of RTP bytes received */ |
| 44 | uint64_t sr_recv; /**< When the last SR was received */ |
| 45 | struct ntp_time last_sr; /**< NTP Timestamp from last SR received */ |
| 46 | uint32_t rtp_ts; /**< RTP timestamp */ |
| 47 | uint32_t psent; /**< RTP packets sent */ |
| 48 | uint32_t osent; /**< RTP octets sent */ |
| 49 | }; |
| 50 | |
| 51 | /** RTP Member */ |
| 52 | struct rtp_member { |
| 53 | struct le le; /**< Hash-table element */ |
| 54 | struct rtp_source *s; /**< RTP source state */ |
| 55 | uint32_t src; /**< Source - used for hash-table lookup */ |
| 56 | int cum_lost; /**< Cumulative number of packets lost */ |
| 57 | uint32_t jit; /**< Jitter in [us] */ |
| 58 | uint32_t rtt; /**< Round-trip time in [us] */ |
| 59 | }; |
| 60 | |
| 61 | |
| 62 | /* Member */ |
| 63 | struct rtp_member *member_add(struct hash *ht, uint32_t src); |
| 64 | struct rtp_member *member_find(struct hash *ht, uint32_t src); |
| 65 | |
| 66 | /* Source */ |
| 67 | void source_init_seq(struct rtp_source *s, uint16_t seq); |
| 68 | int source_update_seq(struct rtp_source *s, uint16_t seq); |
| 69 | void source_calc_jitter(struct rtp_source *s, uint32_t rtp_ts, |
| 70 | uint32_t arrival); |
| 71 | int source_calc_lost(const struct rtp_source *s); |
| 72 | uint8_t source_calc_fraction_lost(struct rtp_source *s); |
| 73 | |
| 74 | /* RR (Reception report) */ |
| 75 | int rtcp_rr_alloc(struct rtcp_rr **rrp, size_t count); |
| 76 | int rtcp_rr_encode(struct mbuf *mb, const struct rtcp_rr *rr); |
| 77 | int rtcp_rr_decode(struct mbuf *mb, struct rtcp_rr *rr); |
| 78 | |
| 79 | /* SDES (Source Description) */ |
| 80 | int rtcp_sdes_decode(struct mbuf *mb, struct rtcp_sdes *sdes); |
| 81 | |
| 82 | /* RTCP Feedback */ |
| 83 | int rtcp_rtpfb_gnack_encode(struct mbuf *mb, uint16_t pid, uint16_t blp); |
| 84 | int rtcp_psfb_sli_encode(struct mbuf *mb, uint16_t first, uint16_t number, |
| 85 | uint8_t picid); |
| 86 | int rtcp_rtpfb_decode(struct mbuf *mb, struct rtcp_msg *msg); |
| 87 | int rtcp_psfb_decode(struct mbuf *mb, struct rtcp_msg *msg); |
| 88 | |
| 89 | /** NTP Time */ |
| 90 | struct timeval; |
| 91 | void unix2ntp(struct ntp_time *ntp, const struct timeval *tv); |
| 92 | void ntp2unix(struct timeval *tv, const struct ntp_time *ntp); |
| 93 | int ntp_time_get(struct ntp_time *ntp); |
| 94 | uint32_t ntp_compact(const struct ntp_time *ntp); |
| 95 | uint64_t ntp_compact2us(uint32_t ntpc); |
| 96 | |
| 97 | /* RTP Socket */ |
| 98 | struct rtcp_sess *rtp_rtcp_sess(const struct rtp_sock *rs); |
| 99 | |
| 100 | /* RTCP message */ |
| 101 | typedef int (rtcp_encode_h)(struct mbuf *mb, void *arg); |
| 102 | |
| 103 | int rtcp_hdr_encode(struct mbuf *mb, uint8_t count, enum rtcp_type type, |
| 104 | uint16_t length); |
| 105 | int rtcp_hdr_decode(struct mbuf *mb, struct rtcp_hdr *hdr); |
| 106 | int rtcp_vencode(struct mbuf *mb, enum rtcp_type type, uint32_t count, |
| 107 | va_list ap); |
| 108 | |
| 109 | /* RTCP Session */ |
| 110 | struct rtcp_sess; |
| 111 | |
| 112 | int rtcp_sess_alloc(struct rtcp_sess **sessp, struct rtp_sock *rs); |
| 113 | int rtcp_enable(struct rtcp_sess *sess, bool enabled, const char *cname); |
| 114 | int rtcp_send(struct rtp_sock *rs, struct mbuf *mb); |
| 115 | void rtcp_handler(struct rtcp_sess *sess, struct rtcp_msg *msg); |
| 116 | void rtcp_sess_tx_rtp(struct rtcp_sess *sess, uint32_t ts, |
| 117 | size_t payload_size); |
| 118 | void rtcp_sess_rx_rtp(struct rtcp_sess *sess, uint16_t seq, uint32_t ts, |
| 119 | uint32_t src, size_t payload_size, |
| 120 | const struct sa *peer); |