@@ -342,14 +342,15 @@ impl Header {
342
342
/// SetExtension sets an RTP header extension
343
343
pub fn set_extension ( & mut self , id : u8 , payload : Bytes ) -> Result < ( ) , Error > {
344
344
if self . extension {
345
- match self . extension_profile {
345
+ let extension_profile_len = match self . extension_profile {
346
346
EXTENSION_PROFILE_ONE_BYTE => {
347
347
if !( 1 ..=14 ) . contains ( & id) {
348
348
return Err ( Error :: ErrRfc8285oneByteHeaderIdrange ) ;
349
349
}
350
350
if payload. len ( ) > 16 {
351
351
return Err ( Error :: ErrRfc8285oneByteHeaderSize ) ;
352
352
}
353
+ 1
353
354
}
354
355
EXTENSION_PROFILE_TWO_BYTE => {
355
356
if id < 1 {
@@ -358,11 +359,13 @@ impl Header {
358
359
if payload. len ( ) > 255 {
359
360
return Err ( Error :: ErrRfc8285twoByteHeaderSize ) ;
360
361
}
362
+ 2
361
363
}
362
364
_ => {
363
365
if id != 0 {
364
366
return Err ( Error :: ErrRfc3550headerIdrange ) ;
365
367
}
368
+ 0
366
369
}
367
370
} ;
368
371
@@ -374,18 +377,30 @@ impl Header {
374
377
{
375
378
extension. payload = payload;
376
379
} else {
380
+ let extension_padding = ( payload. len ( ) + extension_profile_len) % 4 ;
381
+ if self . extensions_padding < extension_padding {
382
+ self . extensions_padding = self . extensions_padding + 4 - extension_padding;
383
+ } else {
384
+ self . extensions_padding -= extension_padding
385
+ }
377
386
self . extensions . push ( Extension { id, payload } ) ;
378
387
}
379
388
} else {
380
389
// No existing header extensions
381
390
self . extension = true ;
382
-
391
+ let mut extension_profile_len = 0 ;
383
392
self . extension_profile = match payload. len ( ) {
384
- 0 ..=16 => EXTENSION_PROFILE_ONE_BYTE ,
385
- 17 ..=255 => EXTENSION_PROFILE_TWO_BYTE ,
393
+ 0 ..=16 => { extension_profile_len = 1 ; EXTENSION_PROFILE_ONE_BYTE } ,
394
+ 17 ..=255 => { extension_profile_len = 2 ; EXTENSION_PROFILE_TWO_BYTE } ,
386
395
_ => self . extension_profile ,
387
396
} ;
388
397
398
+ let extension_padding = ( payload. len ( ) + extension_profile_len) % 4 ;
399
+ if self . extensions_padding < extension_padding {
400
+ self . extensions_padding = self . extensions_padding + 4 - extension_padding;
401
+ } else {
402
+ self . extensions_padding -= extension_padding
403
+ }
389
404
self . extensions . push ( Extension { id, payload } ) ;
390
405
}
391
406
Ok ( ( ) )
0 commit comments