/*
NAME
  parse.go

DESCRIPTION
  parse.go contains functionality for parsing RTCP packets.

AUTHORS
  Saxon A. Nelson-Milton <saxon@ausocean.org>

LICENSE
  This is Copyright (C) 2019 the Australian Ocean Lab (AusOcean)

  It is free software: you can redistribute it and/or modify them
  under the terms of the GNU General Public License as published by the
  Free Software Foundation, either version 3 of the License, or (at your
  option) any later version.

  It is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  for more details.

  You should have received a copy of the GNU General Public License
  in gpl.txt.  If not, see http://www.gnu.org/licenses.
*/

package rtcp

import (
	"encoding/binary"
	"errors"
)

// Timestamp describes an NTP timestamp, see https://tools.ietf.org/html/rfc1305
type Timestamp struct {
	Seconds  uint32
	Fraction uint32
}

// ParseTimestamp gets the timestamp from a receiver report and returns it as
// a Timestamp as defined above. If the given bytes do not represent a valid
// receiver report, an error is returned.
func ParseTimestamp(buf []byte) (Timestamp, error) {
	if len(buf) < 4 {
		return Timestamp{}, errors.New("bad RTCP packet, not of sufficient length")
	}
	if (buf[0]&0xc0)>>6 != rtcpVer {
		return Timestamp{}, errors.New("incompatible RTCP version")
	}

	if buf[1] != typeSenderReport {
		return Timestamp{}, errors.New("RTCP packet is not of sender report type")
	}

	return Timestamp{
		Seconds:  binary.BigEndian.Uint32(buf[8:]),
		Fraction: binary.BigEndian.Uint32(buf[12:]),
	}, nil
}