xref: /webrtc/rtcp/src/util.rs (revision 259fddd2)
1 #[cfg(test)]
2 mod util_test;
3 
4 use util::Error;
5 
6 // getPadding Returns the padding required to make the length a multiple of 4
7 pub(crate) fn get_padding(len: usize) -> usize {
8     if len % 4 == 0 {
9         0
10     } else {
11         4 - (len % 4)
12     }
13 }
14 
15 // set_nbits_of_uint16 will truncate the value to size, left-shift to start_index position and set
16 pub(crate) fn set_nbits_of_uint16(
17     src: u16,
18     size: u16,
19     start_index: u16,
20     mut val: u16,
21 ) -> Result<u16, Error> {
22     if start_index + size > 16 {
23         return Err(Error::new("invalid size or start_index".to_owned()));
24     }
25 
26     // truncate val to size bits
27     val &= (1 << size) - 1;
28 
29     Ok(src | (val << (16 - size - start_index)))
30 }
31 
32 // appendBit32 will left-shift and append n bits of val
33 pub(crate) fn append_nbits_to_uint32(src: u32, n: u32, val: u32) -> u32 {
34     (src << n) | (val & (0xFFFFFFFF >> (32 - n)))
35 }
36 
37 // getNBit get n bits from 1 byte, begin with a position
38 pub(crate) fn get_nbits_from_byte(b: u8, begin: u16, n: u16) -> u16 {
39     let end_shift = 8 - (begin + n);
40     let mask = (0xFF >> begin) & (0xFF << end_shift) as u8;
41     (b & mask) as u16 >> end_shift
42 }
43 
44 // get24BitFromBytes get 24bits from `[3]byte` slice
45 pub(crate) fn get_24bits_from_bytes(b: &[u8]) -> u32 {
46     ((b[0] as u32) << 16) + ((b[1] as u32) << 8) + (b[2] as u32)
47 }
48