@@ -311,7 +311,7 @@ impl Marshal for Header {
311
311
} ;
312
312
313
313
// add padding to reach 4 bytes boundaries
314
- for _ in extension_payload_len..extension_payload_size as usize * 4 {
314
+ for _ in 0 .. self . extensions_padding {
315
315
buf. put_u8 ( 0 ) ;
316
316
}
317
317
}
@@ -341,13 +341,14 @@ impl Header {
341
341
342
342
/// SetExtension sets an RTP header extension
343
343
pub fn set_extension ( & mut self , id : u8 , payload : Bytes ) -> Result < ( ) , Error > {
344
+ let payload_len = payload. len ( ) as isize ;
344
345
if self . extension {
345
346
let extension_profile_len = match self . extension_profile {
346
347
EXTENSION_PROFILE_ONE_BYTE => {
347
348
if !( 1 ..=14 ) . contains ( & id) {
348
349
return Err ( Error :: ErrRfc8285oneByteHeaderIdrange ) ;
349
350
}
350
- if payload . len ( ) > 16 {
351
+ if payload_len > 16 {
351
352
return Err ( Error :: ErrRfc8285oneByteHeaderSize ) ;
352
353
}
353
354
1
@@ -356,7 +357,7 @@ impl Header {
356
357
if id < 1 {
357
358
return Err ( Error :: ErrRfc8285twoByteHeaderIdrange ) ;
358
359
}
359
- if payload . len ( ) > 255 {
360
+ if payload_len > 255 {
360
361
return Err ( Error :: ErrRfc8285twoByteHeaderSize ) ;
361
362
}
362
363
2
@@ -369,27 +370,35 @@ impl Header {
369
370
}
370
371
} ;
371
372
373
+ let delta;
372
374
// Update existing if it exists else add new extension
373
375
if let Some ( extension) = self
374
376
. extensions
375
377
. iter_mut ( )
376
378
. find ( |extension| extension. id == id)
377
379
{
380
+ delta = payload_len - extension. payload . len ( ) as isize ;
378
381
extension. payload = payload;
379
382
} else {
380
- let extension_padding = ( payload. len ( ) + extension_profile_len) % 4 ;
383
+ delta = payload_len + extension_profile_len;
384
+ self . extensions . push ( Extension { id, payload } ) ;
385
+ }
386
+
387
+ if delta > 0 {
388
+ let extension_padding = ( delta % 4 ) as usize ;
381
389
if self . extensions_padding < extension_padding {
382
- self . extensions_padding = self . extensions_padding + 4 - extension_padding;
390
+ self . extensions_padding = ( self . extensions_padding + 4 ) - extension_padding;
383
391
} else {
384
392
self . extensions_padding -= extension_padding
385
393
}
386
- self . extensions . push ( Extension { id, payload } ) ;
394
+ } else if delta < 0 {
395
+ self . extensions_padding = ( ( self . extensions_padding as isize - delta) % 4 ) as usize ;
387
396
}
388
397
} else {
389
398
// No existing header extensions
390
399
self . extension = true ;
391
400
let mut extension_profile_len = 0 ;
392
- self . extension_profile = match payload . len ( ) {
401
+ self . extension_profile = match payload_len {
393
402
0 ..=16 => {
394
403
extension_profile_len = 1 ;
395
404
EXTENSION_PROFILE_ONE_BYTE
@@ -441,7 +450,17 @@ impl Header {
441
450
. iter ( )
442
451
. position ( |extension| extension. id == id)
443
452
{
444
- self . extensions . remove ( index) ;
453
+ let extension = self . extensions . remove ( index) ;
454
+
455
+ let extension_profile_len = match self . extension_profile {
456
+ EXTENSION_PROFILE_ONE_BYTE => 1 ,
457
+ EXTENSION_PROFILE_TWO_BYTE => 2 ,
458
+ _ => 0 ,
459
+ } ;
460
+
461
+ let extension_padding = ( extension. payload . len ( ) + extension_profile_len) % 4 ;
462
+ self . extensions_padding = ( self . extensions_padding + extension_padding) % 4 ;
463
+
445
464
Ok ( ( ) )
446
465
} else {
447
466
Err ( Error :: ErrHeaderExtensionNotFound )
0 commit comments