av/protocol/rtcp/rtcp.go

100 lines
2.0 KiB
Go

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
}