Files
2026-05-18 13:06:57 -04:00

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
}