rtpaac: do not touch pkt.Payload when decoding

This commit is contained in:
aler9
2022-03-06 17:55:02 +01:00
parent a541ae8f96
commit ad4c3f1f53

View File

@@ -43,7 +43,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) {
d.isDecodingFragmented = false d.isDecodingFragmented = false
return nil, 0, fmt.Errorf("invalid AU-headers-length (%d)", headersLen) return nil, 0, fmt.Errorf("invalid AU-headers-length (%d)", headersLen)
} }
pkt.Payload = pkt.Payload[2:] payload := pkt.Payload[2:]
if !d.isDecodingFragmented { if !d.isDecodingFragmented {
if pkt.Header.Marker { if pkt.Header.Marker {
@@ -54,11 +54,11 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) {
headerCount := headersLen / 16 headerCount := headersLen / 16
var dataLens []uint16 var dataLens []uint16
for i := 0; i < int(headerCount); i++ { for i := 0; i < int(headerCount); i++ {
if len(pkt.Payload[i*2:]) < 2 { if len(payload[i*2:]) < 2 {
return nil, 0, fmt.Errorf("payload is too short") return nil, 0, fmt.Errorf("payload is too short")
} }
header := binary.BigEndian.Uint16(pkt.Payload[i*2:]) header := binary.BigEndian.Uint16(payload[i*2:])
dataLen := header >> 3 dataLen := header >> 3
auIndex := header & 0x03 auIndex := header & 0x03
if auIndex != 0 { if auIndex != 0 {
@@ -67,17 +67,17 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) {
dataLens = append(dataLens, dataLen) dataLens = append(dataLens, dataLen)
} }
pkt.Payload = pkt.Payload[headerCount*2:] payload = payload[headerCount*2:]
// AUs // AUs
aus := make([][]byte, len(dataLens)) aus := make([][]byte, len(dataLens))
for i, dataLen := range dataLens { for i, dataLen := range dataLens {
if len(pkt.Payload) < int(dataLen) { if len(payload) < int(dataLen) {
return nil, 0, fmt.Errorf("payload is too short") return nil, 0, fmt.Errorf("payload is too short")
} }
aus[i] = pkt.Payload[:dataLen] aus[i] = payload[:dataLen]
pkt.Payload = pkt.Payload[dataLen:] payload = payload[dataLen:]
} }
return aus, d.timeDecoder.Decode(pkt.Timestamp), nil return aus, d.timeDecoder.Decode(pkt.Timestamp), nil
@@ -88,19 +88,19 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) {
} }
// AU-header // AU-header
header := binary.BigEndian.Uint16(pkt.Payload) header := binary.BigEndian.Uint16(payload)
dataLen := header >> 3 dataLen := header >> 3
auIndex := header & 0x03 auIndex := header & 0x03
if auIndex != 0 { if auIndex != 0 {
return nil, 0, fmt.Errorf("AU-index field is not zero") return nil, 0, fmt.Errorf("AU-index field is not zero")
} }
pkt.Payload = pkt.Payload[2:] payload = payload[2:]
if len(pkt.Payload) < int(dataLen) { if len(payload) < int(dataLen) {
return nil, 0, fmt.Errorf("payload is too short") return nil, 0, fmt.Errorf("payload is too short")
} }
d.fragmentedBuf = append(d.fragmentedBuf, pkt.Payload...) d.fragmentedBuf = append(d.fragmentedBuf, payload...)
d.isDecodingFragmented = true d.isDecodingFragmented = true
return nil, 0, ErrMorePacketsNeeded return nil, 0, ErrMorePacketsNeeded
@@ -113,19 +113,19 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) {
} }
// AU-header // AU-header
header := binary.BigEndian.Uint16(pkt.Payload) header := binary.BigEndian.Uint16(payload)
dataLen := header >> 3 dataLen := header >> 3
auIndex := header & 0x03 auIndex := header & 0x03
if auIndex != 0 { if auIndex != 0 {
return nil, 0, fmt.Errorf("AU-index field is not zero") return nil, 0, fmt.Errorf("AU-index field is not zero")
} }
pkt.Payload = pkt.Payload[2:] payload = payload[2:]
if len(pkt.Payload) < int(dataLen) { if len(payload) < int(dataLen) {
return nil, 0, fmt.Errorf("payload is too short") return nil, 0, fmt.Errorf("payload is too short")
} }
d.fragmentedBuf = append(d.fragmentedBuf, pkt.Payload...) d.fragmentedBuf = append(d.fragmentedBuf, payload...)
if !pkt.Header.Marker { if !pkt.Header.Marker {
return nil, 0, ErrMorePacketsNeeded return nil, 0, ErrMorePacketsNeeded