Skip to content

Commit 7c38c17

Browse files
committed
restore ability to decode AV1 packets with W != 0
1 parent c9b91e6 commit 7c38c17

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

pkg/format/rtpav1/decoder.go

+23-11
Original file line numberDiff line numberDiff line change
@@ -66,27 +66,39 @@ func (d *Decoder) decodeOBUs(pkt *rtp.Packet) ([][]byte, error) {
6666

6767
z := (pkt.Payload[0] & 0b10000000) != 0
6868
y := (pkt.Payload[0] & 0b01000000) != 0
69+
w := (pkt.Payload[0] >> 4) & 0b11
6970
payload := pkt.Payload[1:]
7071
var obus [][]byte
7172

7273
for len(payload) > 0 {
73-
var size av1.LEB128
74-
n, err := size.Unmarshal(payload)
75-
if err != nil {
76-
d.resetFragments()
77-
return nil, err
78-
}
79-
payload = payload[n:]
74+
var obu []byte
75+
76+
if w == 0 || byte(len(obus)) < (w-1) {
77+
var size av1.LEB128
78+
n, err := size.Unmarshal(payload)
79+
if err != nil {
80+
d.resetFragments()
81+
return nil, err
82+
}
83+
payload = payload[n:]
8084

81-
if size == 0 || len(payload) < int(size) {
82-
return nil, fmt.Errorf("invalid fragmented OBU (invalid size)")
85+
if size == 0 || len(payload) < int(size) {
86+
d.resetFragments()
87+
return nil, fmt.Errorf("invalid OBU size")
88+
}
89+
90+
obu, payload = payload[:size], payload[size:]
91+
} else {
92+
obu, payload = payload, nil
8393
}
8494

85-
var obu []byte
86-
obu, payload = payload[:size], payload[size:]
8795
obus = append(obus, obu)
8896
}
8997

98+
if w != 0 && len(obus) != int(w) {
99+
return nil, fmt.Errorf("invalid W field")
100+
}
101+
90102
// first OBU is continuation of previous one
91103
if z {
92104
if d.fragmentsSize == 0 {

0 commit comments

Comments
 (0)