2019-04-09 06:02:12 +03:00
|
|
|
package rtcp
|
|
|
|
|
|
|
|
import (
|
2019-04-10 08:49:45 +03:00
|
|
|
"encoding/binary"
|
2019-04-09 06:02:12 +03:00
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
|
|
|
)
|
|
|
|
|
2019-04-10 08:49:45 +03:00
|
|
|
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
|
|
|
|
}
|
2019-04-09 06:02:12 +03:00
|
|
|
func Handle(r io.Reader) error {
|
|
|
|
io.Copy(ioutil.Discard, r)
|
|
|
|
return nil
|
|
|
|
}
|