Skip to content

Commit eefb599

Browse files
HITGIFrainliu
authored andcommitted
format
1 parent 46fef88 commit eefb599

File tree

5 files changed

+442
-394
lines changed

5 files changed

+442
-394
lines changed

rtp/src/codecs/av1/leb128.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use bytes::{BufMut, Bytes, BytesMut};
2+
3+
pub fn encode_leb128(mut val: u32) -> u32 {
4+
let mut b = 0;
5+
loop {
6+
b |= val & 0b_0111_1111;
7+
val >>= 7;
8+
if val != 0 {
9+
b |= 0b_1000_0000;
10+
b <<= 8;
11+
} else {
12+
return b;
13+
}
14+
}
15+
}
16+
17+
pub fn decode_leb128(mut val: u32) -> u32 {
18+
let mut b = 0;
19+
loop {
20+
b |= val & 0b_0111_1111;
21+
val >>= 8;
22+
if val == 0 {
23+
return b;
24+
}
25+
b <<= 7;
26+
}
27+
}
28+
29+
pub fn read_leb128(bytes: &Bytes) -> (u32, usize) {
30+
let mut encoded = 0;
31+
for i in 0..bytes.len() {
32+
encoded |= bytes[i] as u32;
33+
if bytes[i] & 0b_1000_0000 == 0 {
34+
return (decode_leb128(encoded), i + 1);
35+
}
36+
encoded <<= 8;
37+
}
38+
(0, 0)
39+
}
40+
41+
pub fn leb128_size(value: u32) -> usize {
42+
let mut size = 0;
43+
let mut value = value;
44+
while value >= 0b_1000_0000 {
45+
size += 1;
46+
value >>= 7;
47+
}
48+
size + 1
49+
}
50+
51+
pub trait BytesMutExt {
52+
fn put_leb128(&mut self, n: u32);
53+
}
54+
55+
impl BytesMutExt for BytesMut {
56+
fn put_leb128(&mut self, n: u32) {
57+
let encoded = encode_leb128(n);
58+
let leb128_size = leb128_size(n);
59+
for i in (0..leb128_size).rev() {
60+
let byte = (encoded >> (i * 8)) as u8;
61+
self.put_u8(byte)
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)