1use super::errors::H264Error;
2use bytesio::bits_reader::BitsReader;
3
4pub fn read_uev(bit_reader: &mut BitsReader) -> Result<u32, H264Error> {
13 let mut leading_zeros_bits: usize = 0;
14
15 loop {
16 if bit_reader.read_bit()? != 0 {
17 break;
18 }
19 leading_zeros_bits += 1;
20 }
21 let code_num = (1 << leading_zeros_bits) - 1 + bit_reader.read_n_bits(leading_zeros_bits)?;
22 Ok(code_num as u32)
23}
24
25pub fn read_sev(bit_reader: &mut BitsReader) -> Result<i32, H264Error> {
27 let code_num = read_uev(bit_reader)?;
28
29 let negative: i64 = if code_num % 2 == 0 { -1 } else { 1 };
30 let se_value = (code_num as i64 + 1) / 2 * negative;
31 Ok(se_value as i32)
32}
33
34#[cfg(test)]
35mod tests {
36
37 use super::read_uev;
38 use bytes::BytesMut;
39 use bytesio::bits_reader::BitsReader;
40 use bytesio::bytes_reader::BytesReader;
41
42 #[test]
43 fn test_read_uev() {
44 let mut bytes_reader = BytesReader::new(BytesMut::new());
55 bytes_reader.extend_from_slice(&[0b00000001]);
56 bytes_reader.extend_from_slice(&[0b00000010]);
57 bytes_reader.extend_from_slice(&[0b00000011]);
58 bytes_reader.extend_from_slice(&[0b00000100]);
59 bytes_reader.extend_from_slice(&[0b00000101]);
60 bytes_reader.extend_from_slice(&[0b00000110]);
61 bytes_reader.extend_from_slice(&[0b00000111]);
62 bytes_reader.extend_from_slice(&[0b00001000]);
63 bytes_reader.extend_from_slice(&[0b00001001]);
64
65 let mut bits_reader = BitsReader::new(bytes_reader);
66
67 bits_reader.read_n_bits(7).unwrap();
68 let v1 = read_uev(&mut bits_reader).unwrap();
69 println!("=={v1}==");
70 assert!(v1 == 0);
71
72 bits_reader.read_n_bits(5).unwrap();
73 let v2 = read_uev(&mut bits_reader).unwrap();
74 println!("=={v2}==");
75 assert!(v2 == 1);
76
77 bits_reader.read_n_bits(5).unwrap();
78 let v3 = read_uev(&mut bits_reader).unwrap();
79 println!("=={v3}==");
80 assert!(v3 == 2);
81
82 bits_reader.read_n_bits(3).unwrap();
83 let v4 = read_uev(&mut bits_reader).unwrap();
84 println!("=={v4}==");
85 assert!(v4 == 3);
86
87 bits_reader.read_n_bits(3).unwrap();
88 let v5 = read_uev(&mut bits_reader).unwrap();
89 println!("=={v5}==");
90 assert!(v5 == 4);
91
92 bits_reader.read_n_bits(3).unwrap();
93 let v6 = read_uev(&mut bits_reader).unwrap();
94 println!("=={v6}==");
95 assert!(v6 == 5);
96
97 bits_reader.read_n_bits(3).unwrap();
98 let v7 = read_uev(&mut bits_reader).unwrap();
99 println!("=={v7}==");
100 assert!(v7 == 6);
101
102 bits_reader.read_n_bits(1).unwrap();
103 let v8 = read_uev(&mut bits_reader).unwrap();
104 println!("=={v8}==");
105 assert!(v8 == 7);
106
107 bits_reader.read_n_bits(1).unwrap();
108 let v9 = read_uev(&mut bits_reader).unwrap();
109 println!("=={v9}==");
110 assert!(v9 == 8);
111 }
112}