/* 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 } // Timestamp gets the timestamp from a receiver report and returns it as the most // significant word, and the least significant word. If the given bytes do not // represent a valid receiver report, an error is returned. func ParseTimestamp(buf []byte) (Timestamp, error) { err := checkPacket(buf) if err != nil { return Timestamp{}, err } return Timestamp{ Seconds: binary.BigEndian.Uint32(buf[8:]), Fraction: binary.BigEndian.Uint32(buf[12:]), }, nil } func ParseSSRC(buf []byte) (uint32, error) { err := checkPacket(buf) if err != nil { return 0, err } return binary.BigEndian.Uint32(buf[4:]), nil } func checkPacket(buf []byte) error { if len(buf) < 4 { return errors.New("bad RTCP packet, not of sufficient length") } if (buf[0]&0xc0)>>6 != rtcpVer { return errors.New("incompatible RTCP version") } if buf[1] != typeSenderReport { return errors.New("RTCP packet is not of sender report type") } return nil }