/**
 * @file rtp/rr.c  RTCP Reception report
 *
 * Copyright (C) 2010 Creytiv.com
 */
#include <re_types.h>
#include <string.h>
#include <re_fmt.h>
#include <re_mem.h>
#include <re_mbuf.h>
#include <re_list.h>
#include <re_sa.h>
#include <re_sys.h>
#include <re_net.h>
#include <re_rtp.h>
#include "rtcp.h"


int rtcp_rr_alloc(struct rtcp_rr **rrp, size_t count)
{
	struct rtcp_rr *rr;

	if (!rrp)
		return EINVAL;

	rr = mem_alloc(count * sizeof(*rr), NULL);
	if (!rr)
		return ENOMEM;

	*rrp = rr;
	return 0;
}


int rtcp_rr_encode(struct mbuf *mb, const struct rtcp_rr *rr)
{
	int err;

	if (!mb || !rr)
		return EINVAL;

	err  = mbuf_write_u32(mb, htonl(rr->ssrc));
	err |= mbuf_write_u32(mb, htonl(rr->fraction<<24 |
					(rr->lost & 0x00ffffff)));
	err |= mbuf_write_u32(mb, htonl(rr->last_seq));
	err |= mbuf_write_u32(mb, htonl(rr->jitter));
	err |= mbuf_write_u32(mb, htonl(rr->lsr));
	err |= mbuf_write_u32(mb, htonl(rr->dlsr));

	return err;
}


int rtcp_rr_decode(struct mbuf *mb, struct rtcp_rr *rr)
{
	uint32_t w;

	if (!rr)
		return EINVAL;
	if (mbuf_get_left(mb) < RTCP_RR_SIZE)
		return EBADMSG;

	rr->ssrc     = ntohl(mbuf_read_u32(mb));
	w = ntohl(mbuf_read_u32(mb));
	rr->fraction = w>>24; rr->lost = w & 0x00ffffffU;
	rr->last_seq = ntohl(mbuf_read_u32(mb));
	rr->jitter   = ntohl(mbuf_read_u32(mb));
	rr->lsr      = ntohl(mbuf_read_u32(mb));
	rr->dlsr     = ntohl(mbuf_read_u32(mb));

	return 0;
}
