Skip to content

Commit

Permalink
Minimize changes
Browse files Browse the repository at this point in the history
  • Loading branch information
aler9 authored and Sean-Der committed Jun 14, 2023
1 parent 8fc8b94 commit a11a460
Showing 1 changed file with 58 additions and 57 deletions.
115 changes: 58 additions & 57 deletions packet.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,10 @@ func (p Packet) String() string {
return out
}

// Unmarshal parses the passed byte slice and stores the result in the Header this method is called upon
func (h *Header) Unmarshal(rawPacket []byte) error { //nolint:gocognit
if len(rawPacket) < headerLength {
return fmt.Errorf("%w: %d < %d", errHeaderSizeInsufficient, len(rawPacket), headerLength)
// Unmarshal parses the passed byte slice and stores the result in the Header.
func (h *Header) Unmarshal(buf []byte) error { //nolint:gocognit
if len(buf) < headerLength {
return fmt.Errorf("%w: %d < %d", errHeaderSizeInsufficient, len(buf), headerLength)
}

/*
Expand All @@ -102,133 +102,133 @@ func (h *Header) Unmarshal(rawPacket []byte) error { //nolint:gocognit
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/

h.Version = rawPacket[0] >> versionShift & versionMask
h.Padding = (rawPacket[0] >> paddingShift & paddingMask) > 0
h.Extension = (rawPacket[0] >> extensionShift & extensionMask) > 0
nCSRC := int(rawPacket[0] & ccMask)
h.Version = buf[0] >> versionShift & versionMask
h.Padding = (buf[0] >> paddingShift & paddingMask) > 0
h.Extension = (buf[0] >> extensionShift & extensionMask) > 0
nCSRC := int(buf[0] & ccMask)
if cap(h.CSRC) < nCSRC || h.CSRC == nil {
h.CSRC = make([]uint32, nCSRC)
} else {
h.CSRC = h.CSRC[:nCSRC]
}

currOffset := csrcOffset + (nCSRC * csrcLength)
if len(rawPacket) < currOffset {
return fmt.Errorf("size %d < %d: %w", len(rawPacket), currOffset, errHeaderSizeInsufficient)
n := csrcOffset + (nCSRC * csrcLength)
if len(buf) < n {
return fmt.Errorf("size %d < %d: %w", len(buf), n, errHeaderSizeInsufficient)
}

h.Marker = (rawPacket[1] >> markerShift & markerMask) > 0
h.PayloadType = rawPacket[1] & ptMask
h.Marker = (buf[1] >> markerShift & markerMask) > 0
h.PayloadType = buf[1] & ptMask

h.SequenceNumber = binary.BigEndian.Uint16(rawPacket[seqNumOffset : seqNumOffset+seqNumLength])
h.Timestamp = binary.BigEndian.Uint32(rawPacket[timestampOffset : timestampOffset+timestampLength])
h.SSRC = binary.BigEndian.Uint32(rawPacket[ssrcOffset : ssrcOffset+ssrcLength])
h.SequenceNumber = binary.BigEndian.Uint16(buf[seqNumOffset : seqNumOffset+seqNumLength])
h.Timestamp = binary.BigEndian.Uint32(buf[timestampOffset : timestampOffset+timestampLength])
h.SSRC = binary.BigEndian.Uint32(buf[ssrcOffset : ssrcOffset+ssrcLength])

for i := range h.CSRC {
offset := csrcOffset + (i * csrcLength)
h.CSRC[i] = binary.BigEndian.Uint32(rawPacket[offset:])
h.CSRC[i] = binary.BigEndian.Uint32(buf[offset:])
}

if h.Extensions != nil {
h.Extensions = h.Extensions[:0]
}

if h.Extension {
if expected := currOffset + 4; len(rawPacket) < expected {
if expected := n + 4; len(buf) < expected {
return fmt.Errorf("size %d < %d: %w",
len(rawPacket), expected,
len(buf), expected,
errHeaderSizeInsufficientForExtension,
)
}

h.ExtensionProfile = binary.BigEndian.Uint16(rawPacket[currOffset:])
currOffset += 2
extensionLength := int(binary.BigEndian.Uint16(rawPacket[currOffset:])) * 4
currOffset += 2
h.ExtensionProfile = binary.BigEndian.Uint16(buf[n:])
n += 2
extensionLength := int(binary.BigEndian.Uint16(buf[n:])) * 4
n += 2

if expected := currOffset + extensionLength; len(rawPacket) < expected {
if expected := n + extensionLength; len(buf) < expected {
return fmt.Errorf("size %d < %d: %w",
len(rawPacket), expected,
len(buf), expected,
errHeaderSizeInsufficientForExtension,
)
}

switch h.ExtensionProfile {
// RFC 8285 RTP One Byte Header Extension
case extensionProfileOneByte:
end := currOffset + extensionLength
for currOffset < end {
if rawPacket[currOffset] == 0x00 { // padding
currOffset++
end := n + extensionLength
for n < end {
if buf[n] == 0x00 { // padding
n++
continue
}

extid := rawPacket[currOffset] >> 4
payloadLen := int(rawPacket[currOffset]&^0xF0 + 1)
currOffset++
extid := buf[n] >> 4
payloadLen := int(buf[n]&^0xF0 + 1)
n++

if extid == extensionIDReserved {
break
}

extension := Extension{id: extid, payload: rawPacket[currOffset : currOffset+payloadLen]}
extension := Extension{id: extid, payload: buf[n : n+payloadLen]}
h.Extensions = append(h.Extensions, extension)
currOffset += payloadLen
n += payloadLen
}

// RFC 8285 RTP Two Byte Header Extension
case extensionProfileTwoByte:
end := currOffset + extensionLength
for currOffset < end {
if rawPacket[currOffset] == 0x00 { // padding
currOffset++
end := n + extensionLength
for n < end {
if buf[n] == 0x00 { // padding
n++
continue
}

extid := rawPacket[currOffset]
currOffset++
extid := buf[n]
n++

payloadLen := int(rawPacket[currOffset])
currOffset++
payloadLen := int(buf[n])
n++

extension := Extension{id: extid, payload: rawPacket[currOffset : currOffset+payloadLen]}
extension := Extension{id: extid, payload: buf[n : n+payloadLen]}
h.Extensions = append(h.Extensions, extension)
currOffset += payloadLen
n += payloadLen
}

default: // RFC3550 Extension
if len(rawPacket) < currOffset+extensionLength {
return fmt.Errorf("%w: %d < %d", errHeaderSizeInsufficientForExtension, len(rawPacket), currOffset+extensionLength)
if len(buf) < n+extensionLength {
return fmt.Errorf("%w: %d < %d", errHeaderSizeInsufficientForExtension, len(buf), n+extensionLength)
}

extension := Extension{id: 0, payload: rawPacket[currOffset : currOffset+extensionLength]}
extension := Extension{id: 0, payload: buf[n : n+extensionLength]}
h.Extensions = append(h.Extensions, extension)
currOffset += len(h.Extensions[0].payload)
n += len(h.Extensions[0].payload)
}
}

h.PayloadOffset = currOffset
h.PayloadOffset = n

return nil
}

// Unmarshal parses the passed byte slice and stores the result in the Packet this method is called upon
func (p *Packet) Unmarshal(rawPacket []byte) error {
if err := p.Header.Unmarshal(rawPacket); err != nil {
// Unmarshal parses the passed byte slice and stores the result in the Packet.
func (p *Packet) Unmarshal(buf []byte) error {
if err := p.Header.Unmarshal(buf); err != nil {
return err
}

end := len(rawPacket)
end := len(buf)
if p.Header.Padding {
p.PaddingSize = rawPacket[end-1]
p.PaddingSize = buf[end-1]
end -= int(p.PaddingSize)
}
if end < p.PayloadOffset {
return errTooSmall
}

p.Payload = rawPacket[p.PayloadOffset:end]
p.Raw = rawPacket
p.Payload = buf[p.PayloadOffset:end]
p.Raw = buf

return nil
}
Expand Down Expand Up @@ -267,7 +267,8 @@ func (h Header) MarshalTo(buf []byte) (n int, err error) {
return 0, io.ErrShortBuffer
}

// The first byte contains the version, padding bit, extension bit, and csrc size
// The first byte contains the version, padding bit, extension bit,
// and csrc size.
buf[0] = (h.Version << versionShift) | uint8(len(h.CSRC))
if h.Padding {
buf[0] |= 1 << paddingShift
Expand Down

0 comments on commit a11a460

Please sign in to comment.