@@ -311,7 +311,7 @@ impl Marshal for Header {
311311 } ;
312312
313313 // 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 {
315315 buf. put_u8 ( 0 ) ;
316316 }
317317 }
@@ -341,13 +341,14 @@ impl Header {
341341
342342 /// SetExtension sets an RTP header extension
343343 pub fn set_extension ( & mut self , id : u8 , payload : Bytes ) -> Result < ( ) , Error > {
344+ let payload_len = payload. len ( ) as isize ;
344345 if self . extension {
345346 let extension_profile_len = match self . extension_profile {
346347 EXTENSION_PROFILE_ONE_BYTE => {
347348 if !( 1 ..=14 ) . contains ( & id) {
348349 return Err ( Error :: ErrRfc8285oneByteHeaderIdrange ) ;
349350 }
350- if payload . len ( ) > 16 {
351+ if payload_len > 16 {
351352 return Err ( Error :: ErrRfc8285oneByteHeaderSize ) ;
352353 }
353354 1
@@ -356,7 +357,7 @@ impl Header {
356357 if id < 1 {
357358 return Err ( Error :: ErrRfc8285twoByteHeaderIdrange ) ;
358359 }
359- if payload . len ( ) > 255 {
360+ if payload_len > 255 {
360361 return Err ( Error :: ErrRfc8285twoByteHeaderSize ) ;
361362 }
362363 2
@@ -369,27 +370,35 @@ impl Header {
369370 }
370371 } ;
371372
373+ let delta;
372374 // Update existing if it exists else add new extension
373375 if let Some ( extension) = self
374376 . extensions
375377 . iter_mut ( )
376378 . find ( |extension| extension. id == id)
377379 {
380+ delta = payload_len - extension. payload . len ( ) as isize ;
378381 extension. payload = payload;
379382 } 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 ;
381389 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;
383391 } else {
384392 self . extensions_padding -= extension_padding
385393 }
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 ;
387396 }
388397 } else {
389398 // No existing header extensions
390399 self . extension = true ;
391400 let mut extension_profile_len = 0 ;
392- self . extension_profile = match payload . len ( ) {
401+ self . extension_profile = match payload_len {
393402 0 ..=16 => {
394403 extension_profile_len = 1 ;
395404 EXTENSION_PROFILE_ONE_BYTE
@@ -441,7 +450,17 @@ impl Header {
441450 . iter ( )
442451 . position ( |extension| extension. id == id)
443452 {
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+
445464 Ok ( ( ) )
446465 } else {
447466 Err ( Error :: ErrHeaderExtensionNotFound )
0 commit comments