@@ -149,64 +149,55 @@ func (h *Header) Unmarshal(buf []byte) (n int, err error) { //nolint:gocognit
149
149
n += 2
150
150
extensionLength := int (binary .BigEndian .Uint16 (buf [n :])) * 4
151
151
n += 2
152
+ extensionEnd := n + extensionLength
152
153
153
- if expected := n + extensionLength ; len (buf ) < expected {
154
- return n , fmt .Errorf ("size %d < %d: %w" ,
155
- len (buf ), expected ,
156
- errHeaderSizeInsufficientForExtension ,
157
- )
154
+ if len (buf ) < extensionEnd {
155
+ return n , fmt .Errorf ("size %d < %d: %w" , len (buf ), extensionEnd , errHeaderSizeInsufficientForExtension )
158
156
}
159
157
160
- switch h .ExtensionProfile {
161
- // RFC 8285 RTP One Byte Header Extension
162
- case extensionProfileOneByte :
163
- end := n + extensionLength
164
- for n < end {
158
+ if h .ExtensionProfile == extensionProfileOneByte || h .ExtensionProfile == extensionProfileTwoByte {
159
+ var (
160
+ extid uint8
161
+ payloadLen int
162
+ )
163
+
164
+ for n < extensionEnd {
165
165
if buf [n ] == 0x00 { // padding
166
166
n ++
167
167
continue
168
168
}
169
169
170
- extid := buf [n ] >> 4
171
- payloadLen := int (buf [n ]&^0xF0 + 1 )
172
- n ++
170
+ if h .ExtensionProfile == extensionProfileOneByte {
171
+ extid = buf [n ] >> 4
172
+ payloadLen = int (buf [n ]&^0xF0 + 1 )
173
+ n ++
173
174
174
- if extid == extensionIDReserved {
175
- break
176
- }
175
+ if extid == extensionIDReserved {
176
+ break
177
+ }
178
+ } else {
179
+ extid = buf [n ]
180
+ n ++
177
181
178
- extension := Extension {id : extid , payload : buf [n : n + payloadLen ]}
179
- h .Extensions = append (h .Extensions , extension )
180
- n += payloadLen
181
- }
182
+ if len (buf ) <= n {
183
+ return n , fmt .Errorf ("size %d < %d: %w" , len (buf ), n , errHeaderSizeInsufficientForExtension )
184
+ }
182
185
183
- // RFC 8285 RTP Two Byte Header Extension
184
- case extensionProfileTwoByte :
185
- end := n + extensionLength
186
- for n < end {
187
- if buf [n ] == 0x00 { // padding
186
+ payloadLen = int (buf [n ])
188
187
n ++
189
- continue
190
188
}
191
189
192
- extid := buf [n ]
193
- n ++
194
-
195
- payloadLen := int (buf [n ])
196
- n ++
190
+ if extensionPayloadEnd := n + payloadLen ; len (buf ) <= extensionPayloadEnd {
191
+ return n , fmt .Errorf ("size %d < %d: %w" , len (buf ), extensionPayloadEnd , errHeaderSizeInsufficientForExtension )
192
+ }
197
193
198
194
extension := Extension {id : extid , payload : buf [n : n + payloadLen ]}
199
195
h .Extensions = append (h .Extensions , extension )
200
196
n += payloadLen
201
197
}
202
-
203
- default : // RFC3550 Extension
204
- if len (buf ) < n + extensionLength {
205
- return n , fmt .Errorf ("%w: %d < %d" ,
206
- errHeaderSizeInsufficientForExtension , len (buf ), n + extensionLength )
207
- }
208
-
209
- extension := Extension {id : 0 , payload : buf [n : n + extensionLength ]}
198
+ } else {
199
+ // RFC3550 Extension
200
+ extension := Extension {id : 0 , payload : buf [n :extensionEnd ]}
210
201
h .Extensions = append (h .Extensions , extension )
211
202
n += len (h .Extensions [0 ].payload )
212
203
}
0 commit comments