6
6
7
7
"github.com/bluenviron/mediacommon/v2/pkg/codecs/av1"
8
8
"github.com/pion/rtp"
9
- "github.com/pion/rtp/codecs"
10
9
)
11
10
12
11
// ErrMorePacketsNeeded is returned when more packets are needed.
@@ -61,20 +60,35 @@ func (d *Decoder) resetFragments() {
61
60
}
62
61
63
62
func (d * Decoder ) decodeOBUs (pkt * rtp.Packet ) ([][]byte , error ) {
64
- var av1header codecs.AV1Packet
65
- _ , err := av1header .Unmarshal (pkt .Payload )
66
- if err != nil {
67
- d .resetFragments ()
68
- return nil , fmt .Errorf ("invalid header: %w" , err )
63
+ if len (pkt .Payload ) < 2 {
64
+ return nil , fmt .Errorf ("invalid payload size" )
69
65
}
70
66
71
- for _ , obu := range av1header .OBUElements {
72
- if len (obu ) == 0 {
73
- return nil , fmt .Errorf ("invalid OBU size" )
67
+ z := (pkt .Payload [0 ] & 0b10000000 ) != 0
68
+ y := (pkt .Payload [0 ] & 0b01000000 ) != 0
69
+ payload := pkt .Payload [1 :]
70
+ var obus [][]byte
71
+
72
+ 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
74
78
}
79
+ payload = payload [n :]
80
+
81
+ if size == 0 || len (payload ) < int (size ) {
82
+ return nil , fmt .Errorf ("invalid fragmented OBU (invalid size)" )
83
+ }
84
+
85
+ var obu []byte
86
+ obu , payload = payload [:size ], payload [size :]
87
+ obus = append (obus , obu )
75
88
}
76
89
77
- if av1header .Z {
90
+ // first OBU is continuation of previous one
91
+ if z {
78
92
if d .fragmentsSize == 0 {
79
93
if ! d .firstPacketReceived {
80
94
return nil , ErrNonStartingPacketAndNoPrevious
@@ -83,12 +97,14 @@ func (d *Decoder) decodeOBUs(pkt *rtp.Packet) ([][]byte, error) {
83
97
return nil , fmt .Errorf ("received a subsequent fragment without previous fragments" )
84
98
}
85
99
100
+ d .firstPacketReceived = true
101
+
86
102
if pkt .SequenceNumber != d .fragmentNextSeqNum {
87
103
d .resetFragments ()
88
104
return nil , fmt .Errorf ("discarding frame since a RTP packet is missing" )
89
105
}
90
106
91
- d .fragmentsSize += len (av1header . OBUElements [0 ])
107
+ d .fragmentsSize += len (obus [0 ])
92
108
93
109
if d .fragmentsSize > av1 .MaxTemporalUnitSize {
94
110
errSize := d .fragmentsSize
@@ -97,38 +113,31 @@ func (d *Decoder) decodeOBUs(pkt *rtp.Packet) ([][]byte, error) {
97
113
errSize , av1 .MaxTemporalUnitSize )
98
114
}
99
115
100
- d .fragments = append (d .fragments , av1header .OBUElements [0 ])
101
- av1header .OBUElements = av1header .OBUElements [1 :]
116
+ d .fragments = append (d .fragments , obus [0 ])
102
117
d .fragmentNextSeqNum ++
103
- }
104
-
105
- d .firstPacketReceived = true
106
118
107
- var obus [][]byte
108
-
109
- if len (av1header .OBUElements ) > 0 {
110
- if d .fragmentsSize != 0 {
111
- obus = append (obus , joinFragments (d .fragments , d .fragmentsSize ))
112
- d .resetFragments ()
113
- }
114
-
115
- if av1header .Y {
116
- elementCount := len (av1header .OBUElements )
117
-
118
- d .fragmentsSize = len (av1header .OBUElements [elementCount - 1 ])
119
- d .fragments = append (d .fragments , av1header .OBUElements [elementCount - 1 ])
120
- av1header .OBUElements = av1header .OBUElements [:elementCount - 1 ]
121
- d .fragmentNextSeqNum = pkt .SequenceNumber + 1
119
+ if len (obus ) == 1 && y {
120
+ return nil , ErrMorePacketsNeeded
122
121
}
123
122
124
- obus = append (obus , av1header .OBUElements ... )
125
- } else if ! av1header .Y {
126
- obus = append (obus , joinFragments (d .fragments , d .fragmentsSize ))
123
+ obus [0 ] = joinFragments (d .fragments , d .fragmentsSize )
127
124
d .resetFragments ()
125
+ } else {
126
+ d .firstPacketReceived = true
128
127
}
129
128
130
- if len (obus ) == 0 {
131
- return nil , ErrMorePacketsNeeded
129
+ // last OBU will continue in next packet
130
+ if y {
131
+ var obu []byte
132
+ obu , obus = obus [len (obus )- 1 ], obus [:len (obus )- 1 ]
133
+
134
+ d .fragmentsSize = len (obu )
135
+ d .fragments = append (d .fragments , obu )
136
+ d .fragmentNextSeqNum = pkt .SequenceNumber + 1
137
+
138
+ if len (obus ) == 0 {
139
+ return nil , ErrMorePacketsNeeded
140
+ }
132
141
}
133
142
134
143
return obus , nil
0 commit comments