package rtcp import ( "encoding/binary" "io" "io/ioutil" ) const ( reportBlockSize = 6 ) type Header struct { Version uint8 // RTCP version. Padding bool // Padding indicator. ReportCount uint8 // Number of reports contained. Type uint8 // Type of RTCP packet. SSRC uint32 // Source identifier. } type ReportBlock struct { SSRC uint32 // Source identifier. FractionLost uint8 // Fraction of packets lost. PacketsLost uint32 // Cumulative number of packets lost. HighestSequence uint32 // Extended highest sequence number received. Jitter uint32 // Interarrival jitter. LSR uint32 // Last sender report timestamp. DLSR uint32 // Delay since last sender report. } type ReceiverReport struct { Header Blocks []ReportBlock Extensions [][4]byte } func (r *ReceiverReport) Bytes() []byte { l := 8 + 4*reportBlockSize*len(r.Blocks) + 4*len(r.Extensions) buf := make([]byte, l) buf[0] = r.Version<<6 | asByte(r.Padding)<<5 | 0x1f&r.ReportCount buf[1] = r.Type l = 1 + reportBlockSize*len(r.Blocks) + len(r.Extensions) binary.BigEndian.PutUint16(buf[2:], uint16(l)) buf[4] = byte(r.SSRC) idx := 8 for _, b := range r.Blocks { binary.BigEndian.PutUint32(buf[idx:], b.SSRC) idx += 4 binary.BigEndian.PutUint32(buf[idx:], b.PacketsLost) buf[idx] = b.FractionLost idx += 4 binary.BigEndian.PutUint32(buf[idx:], b.HighestSequence) idx += 4 binary.BigEndian.PutUint32(buf[idx:], b.Jitter) idx += 4 binary.BigEndian.PutUint32(buf[idx:], b.LSR) idx += 4 binary.BigEndian.PutUint32(buf[idx:], b.DLSR) idx += 4 } for _, e := range r.Extensions { binary.BigEndian.PutUint32(buf[idx:], binary.BigEndian.Uint32(e[:])) idx += 4 } return buf } type Chunk struct { Type uint8 Test []byte } type SourceDescription struct { Header Chunks []Chunk } func (d *SourceDescription) Bytes() []byte { } func asByte(b bool) byte { if b { return 0x01 } return 0x00 } func Handle(r io.Reader) error { io.Copy(ioutil.Discard, r) return nil }