/* NAME parse.go DESCRIPTION parse.go contains functionality for parsing RTCP packets. AUTHORS Saxon A. Nelson-Milton 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 }