60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package codecs
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
var errTruncated = errors.New("truncated packet")
|
|
|
|
// Flags holds parsed RTP header flags.
|
|
type Flags struct {
|
|
Seqno uint16
|
|
Pid uint16
|
|
Marker bool
|
|
}
|
|
|
|
// PacketFlags extracts basic RTP header flags from a raw packet buffer.
|
|
func PacketFlags(codec string, buf []byte) (Flags, error) {
|
|
if len(buf) < 4 {
|
|
return Flags{}, errTruncated
|
|
}
|
|
|
|
var flags Flags
|
|
flags.Seqno = (uint16(buf[2]) << 8) | uint16(buf[3])
|
|
flags.Marker = (buf[1] & 0x80) != 0
|
|
return flags, nil
|
|
}
|
|
|
|
// RewritePacket rewrites the sequence number and marker bit in a raw RTP packet.
|
|
func RewritePacket(codec string, data []byte, setMarker bool, seqno uint16, delta uint16) error {
|
|
if len(data) < 12 {
|
|
return errTruncated
|
|
}
|
|
|
|
if setMarker {
|
|
data[1] |= 0x80
|
|
}
|
|
|
|
data[2] = uint8(seqno >> 8)
|
|
data[3] = uint8(seqno)
|
|
if delta == 0 {
|
|
return nil
|
|
}
|
|
|
|
offset := 12
|
|
offset += int(data[0]&0x0F) * 4
|
|
if len(data) <= offset {
|
|
return errTruncated
|
|
}
|
|
|
|
if (data[0] & 0x10) != 0 {
|
|
length := uint16(data[offset+2])<<8 | uint16(data[offset+3])
|
|
offset += 4 + int(length)*4
|
|
if len(data) < offset+4 {
|
|
return errTruncated
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|