1 /**
2 * @file rtp/rr.c RTCP Reception report
3 *
4 * Copyright (C) 2010 Creytiv.com
5 */
6 #include <string.h>
7 #include <re_types.h>
8 #include <re_fmt.h>
9 #include <re_mem.h>
10 #include <re_mbuf.h>
11 #include <re_list.h>
12 #include <re_sa.h>
13 #include <re_sys.h>
14 #include <re_net.h>
15 #include <re_rtp.h>
16 #include "rtcp.h"
17
18
rtcp_rr_alloc(struct rtcp_rr ** rrp,size_t count)19 int rtcp_rr_alloc(struct rtcp_rr **rrp, size_t count)
20 {
21 struct rtcp_rr *rr;
22
23 if (!rrp)
24 return EINVAL;
25
26 rr = mem_alloc(count * sizeof(*rr), NULL);
27 if (!rr)
28 return ENOMEM;
29
30 *rrp = rr;
31 return 0;
32 }
33
34
rtcp_rr_encode(struct mbuf * mb,const struct rtcp_rr * rr)35 int rtcp_rr_encode(struct mbuf *mb, const struct rtcp_rr *rr)
36 {
37 int err;
38
39 if (!mb || !rr)
40 return EINVAL;
41
42 err = mbuf_write_u32(mb, htonl(rr->ssrc));
43 err |= mbuf_write_u32(mb, htonl(rr->fraction<<24 |
44 (rr->lost & 0x00ffffff)));
45 err |= mbuf_write_u32(mb, htonl(rr->last_seq));
46 err |= mbuf_write_u32(mb, htonl(rr->jitter));
47 err |= mbuf_write_u32(mb, htonl(rr->lsr));
48 err |= mbuf_write_u32(mb, htonl(rr->dlsr));
49
50 return err;
51 }
52
53
rtcp_rr_decode(struct mbuf * mb,struct rtcp_rr * rr)54 int rtcp_rr_decode(struct mbuf *mb, struct rtcp_rr *rr)
55 {
56 uint32_t w;
57
58 if (!rr)
59 return EINVAL;
60 if (mbuf_get_left(mb) < RTCP_RR_SIZE)
61 return EBADMSG;
62
63 rr->ssrc = ntohl(mbuf_read_u32(mb));
64 w = ntohl(mbuf_read_u32(mb));
65 rr->fraction = w>>24; rr->lost = w & 0x00ffffffU;
66 rr->last_seq = ntohl(mbuf_read_u32(mb));
67 rr->jitter = ntohl(mbuf_read_u32(mb));
68 rr->lsr = ntohl(mbuf_read_u32(mb));
69 rr->dlsr = ntohl(mbuf_read_u32(mb));
70
71 return 0;
72 }
73