Skip to content

Commit 1fc3c17

Browse files
rogurotusrainliu
authored andcommitted
fix
1 parent 1fe4562 commit 1fc3c17

File tree

1 file changed

+27
-8
lines changed

1 file changed

+27
-8
lines changed

rtp/src/header.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)