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