1 // Copyright 2024 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 use crate::internal_utils::*;
16 use crate::parser::mp4box::BoxSize;
17 
18 #[derive(Debug)]
19 pub struct IBitStream<'a> {
20     pub data: &'a [u8],
21     pub bit_offset: usize,
22 }
23 
24 impl IBitStream<'_> {
read_bit(&mut self) -> AvifResult<u8>25     fn read_bit(&mut self) -> AvifResult<u8> {
26         let byte_offset = self.bit_offset / 8;
27         if byte_offset >= self.data.len() {
28             return Err(AvifError::BmffParseFailed("Not enough bits".into()));
29         }
30         let byte = self.data[byte_offset];
31         let shift = 7 - (self.bit_offset % 8);
32         self.bit_offset += 1;
33         Ok((byte >> shift) & 0x01)
34     }
35 
read(&mut self, n: usize) -> AvifResult<u32>36     pub fn read(&mut self, n: usize) -> AvifResult<u32> {
37         assert!(n <= 32);
38         let mut value: u32 = 0;
39         for _i in 0..n {
40             value <<= 1;
41             value |= self.read_bit()? as u32;
42         }
43         Ok(value)
44     }
45 
read_bool(&mut self) -> AvifResult<bool>46     pub fn read_bool(&mut self) -> AvifResult<bool> {
47         let bit = self.read_bit()?;
48         Ok(bit == 1)
49     }
50 
skip(&mut self, n: usize) -> AvifResult<()>51     pub fn skip(&mut self, n: usize) -> AvifResult<()> {
52         if checked_add!(self.bit_offset, n)? > checked_mul!(self.data.len(), 8)? {
53             return Err(AvifError::BmffParseFailed("Not enough bytes".into()));
54         }
55         self.bit_offset += n;
56         Ok(())
57     }
58 
skip_uvlc(&mut self) -> AvifResult<()>59     pub fn skip_uvlc(&mut self) -> AvifResult<()> {
60         // See the section 4.10.3. uvlc() of the AV1 specification.
61         let mut leading_zeros = 0u128; // leadingZeros
62         while !self.read_bool()? {
63             leading_zeros += 1;
64         }
65         if leading_zeros < 32 {
66             self.skip(leading_zeros as usize)?; // f(leadingZeros) value;
67         }
68         Ok(())
69     }
70 
remaining_bits(&self) -> AvifResult<usize>71     pub fn remaining_bits(&self) -> AvifResult<usize> {
72         checked_sub!(checked_mul!(self.data.len(), 8)?, self.bit_offset)
73     }
74 }
75 
76 #[derive(Debug)]
77 pub struct IStream<'a> {
78     pub data: &'a [u8],
79     pub offset: usize,
80 }
81 
82 impl IStream<'_> {
create(data: &[u8]) -> IStream83     pub fn create(data: &[u8]) -> IStream {
84         IStream { data, offset: 0 }
85     }
86 
check(&self, size: usize) -> AvifResult<()>87     fn check(&self, size: usize) -> AvifResult<()> {
88         if self.bytes_left()? < size {
89             return Err(AvifError::BmffParseFailed("".into()));
90         }
91         Ok(())
92     }
93 
sub_stream(&mut self, size: &BoxSize) -> AvifResult<IStream>94     pub fn sub_stream(&mut self, size: &BoxSize) -> AvifResult<IStream> {
95         let offset = self.offset;
96         checked_incr!(
97             self.offset,
98             match size {
99                 BoxSize::FixedSize(size) => {
100                     self.check(*size)?;
101                     *size
102                 }
103                 BoxSize::UntilEndOfStream => self.bytes_left()?,
104             }
105         );
106         Ok(IStream {
107             data: &self.data[offset..self.offset],
108             offset: 0,
109         })
110     }
111 
sub_bit_stream(&mut self, size: usize) -> AvifResult<IBitStream>112     pub fn sub_bit_stream(&mut self, size: usize) -> AvifResult<IBitStream> {
113         self.check(size)?;
114         let offset = self.offset;
115         checked_incr!(self.offset, size);
116         Ok(IBitStream {
117             data: &self.data[offset..self.offset],
118             bit_offset: 0,
119         })
120     }
121 
bytes_left(&self) -> AvifResult<usize>122     pub fn bytes_left(&self) -> AvifResult<usize> {
123         if self.data.len() < self.offset {
124             return Err(AvifError::UnknownError("".into()));
125         }
126         Ok(self.data.len() - self.offset)
127     }
128 
has_bytes_left(&self) -> AvifResult<bool>129     pub fn has_bytes_left(&self) -> AvifResult<bool> {
130         Ok(self.bytes_left()? > 0)
131     }
132 
get_slice(&mut self, size: usize) -> AvifResult<&[u8]>133     pub fn get_slice(&mut self, size: usize) -> AvifResult<&[u8]> {
134         self.check(size)?;
135         let offset_start = self.offset;
136         checked_incr!(self.offset, size);
137         Ok(&self.data[offset_start..offset_start + size])
138     }
139 
get_immutable_vec(&self, size: usize) -> AvifResult<Vec<u8>>140     pub fn get_immutable_vec(&self, size: usize) -> AvifResult<Vec<u8>> {
141         self.check(size)?;
142         Ok(self.data[self.offset..self.offset + size].to_vec())
143     }
144 
get_vec(&mut self, size: usize) -> AvifResult<Vec<u8>>145     fn get_vec(&mut self, size: usize) -> AvifResult<Vec<u8>> {
146         Ok(self.get_slice(size)?.to_vec())
147     }
148 
read_u8(&mut self) -> AvifResult<u8>149     pub fn read_u8(&mut self) -> AvifResult<u8> {
150         self.check(1)?;
151         let value = self.data[self.offset];
152         checked_incr!(self.offset, 1);
153         Ok(value)
154     }
155 
read_u16(&mut self) -> AvifResult<u16>156     pub fn read_u16(&mut self) -> AvifResult<u16> {
157         Ok(u16::from_be_bytes(self.get_slice(2)?.try_into().unwrap()))
158     }
159 
read_u24(&mut self) -> AvifResult<u32>160     pub fn read_u24(&mut self) -> AvifResult<u32> {
161         Ok(self.read_uxx(3)? as u32)
162     }
163 
read_u32(&mut self) -> AvifResult<u32>164     pub fn read_u32(&mut self) -> AvifResult<u32> {
165         Ok(u32::from_be_bytes(self.get_slice(4)?.try_into().unwrap()))
166     }
167 
read_u64(&mut self) -> AvifResult<u64>168     pub fn read_u64(&mut self) -> AvifResult<u64> {
169         Ok(u64::from_be_bytes(self.get_slice(8)?.try_into().unwrap()))
170     }
171 
read_i32(&mut self) -> AvifResult<i32>172     pub fn read_i32(&mut self) -> AvifResult<i32> {
173         // For now this is used only for gainmap fractions where we need
174         // wrapping conversion from u32 to i32.
175         Ok(self.read_u32()? as i32)
176     }
177 
skip_u16(&mut self) -> AvifResult<()>178     pub fn skip_u16(&mut self) -> AvifResult<()> {
179         self.skip(2)
180     }
181 
skip_u32(&mut self) -> AvifResult<()>182     pub fn skip_u32(&mut self) -> AvifResult<()> {
183         self.skip(4)
184     }
185 
skip_u64(&mut self) -> AvifResult<()>186     pub fn skip_u64(&mut self) -> AvifResult<()> {
187         self.skip(8)
188     }
189 
read_fraction(&mut self) -> AvifResult<Fraction>190     pub fn read_fraction(&mut self) -> AvifResult<Fraction> {
191         Ok(Fraction(self.read_i32()?, self.read_u32()?))
192     }
193 
read_ufraction(&mut self) -> AvifResult<UFraction>194     pub fn read_ufraction(&mut self) -> AvifResult<UFraction> {
195         Ok(UFraction(self.read_u32()?, self.read_u32()?))
196     }
197 
198     // Reads size characters of a non-null-terminated string.
read_string(&mut self, size: usize) -> AvifResult<String>199     pub fn read_string(&mut self, size: usize) -> AvifResult<String> {
200         Ok(String::from_utf8(self.get_vec(size)?).unwrap_or("".into()))
201     }
202 
203     // Reads an xx-byte unsigner integer.
read_uxx(&mut self, xx: u8) -> AvifResult<u64>204     pub fn read_uxx(&mut self, xx: u8) -> AvifResult<u64> {
205         let n: usize = xx.into();
206         if n == 0 {
207             return Ok(0);
208         }
209         if n > 8 {
210             return Err(AvifError::NotImplemented);
211         }
212         let mut out = [0; 8];
213         let start = out.len() - n;
214         out[start..].copy_from_slice(self.get_slice(n)?);
215         Ok(u64::from_be_bytes(out))
216     }
217 
218     // Reads a null-terminated string.
read_c_string(&mut self) -> AvifResult<String>219     pub fn read_c_string(&mut self) -> AvifResult<String> {
220         self.check(1)?;
221         let null_position = self.data[self.offset..]
222             .iter()
223             .position(|&x| x == b'\0')
224             .ok_or(AvifError::BmffParseFailed("".into()))?;
225         let range = self.offset..self.offset + null_position;
226         self.offset += null_position + 1;
227         Ok(String::from_utf8(self.data[range].to_vec()).unwrap_or("".into()))
228     }
229 
read_version_and_flags(&mut self) -> AvifResult<(u8, u32)>230     pub fn read_version_and_flags(&mut self) -> AvifResult<(u8, u32)> {
231         let version = self.read_u8()?;
232         let flags = self.read_u24()?;
233         Ok((version, flags))
234     }
235 
read_and_enforce_version_and_flags( &mut self, enforced_version: u8, ) -> AvifResult<(u8, u32)>236     pub fn read_and_enforce_version_and_flags(
237         &mut self,
238         enforced_version: u8,
239     ) -> AvifResult<(u8, u32)> {
240         let (version, flags) = self.read_version_and_flags()?;
241         if version != enforced_version {
242             return Err(AvifError::BmffParseFailed("".into()));
243         }
244         Ok((version, flags))
245     }
246 
skip(&mut self, size: usize) -> AvifResult<()>247     pub fn skip(&mut self, size: usize) -> AvifResult<()> {
248         self.check(size)?;
249         checked_incr!(self.offset, size);
250         Ok(())
251     }
252 
rewind(&mut self, size: usize) -> AvifResult<()>253     pub fn rewind(&mut self, size: usize) -> AvifResult<()> {
254         checked_decr!(self.offset, size);
255         Ok(())
256     }
257 
read_uleb128(&mut self) -> AvifResult<u32>258     pub fn read_uleb128(&mut self) -> AvifResult<u32> {
259         // See the section 4.10.5. of the AV1 specification.
260         let mut value: u64 = 0;
261         for i in 0..8 {
262             // leb128_byte contains 8 bits read from the bitstream.
263             let leb128_byte = self.read_u8()?;
264             // The bottom 7 bits are used to compute the variable value.
265             value |= u64::from(leb128_byte & 0x7F) << (i * 7);
266             // The most significant bit is used to indicate that there are more
267             // bytes to be read.
268             if (leb128_byte & 0x80) == 0 {
269                 // It is a requirement of bitstream conformance that the value
270                 // returned from the leb128 parsing process is less than or
271                 // equal to (1 << 32)-1.
272                 return u32_from_u64(value);
273             }
274         }
275         // It is a requirement of bitstream conformance that the most
276         // significant bit of leb128_byte is equal to 0 if i is equal to 7.
277         Err(AvifError::BmffParseFailed(
278             "uleb value did not terminate after 8 bytes".into(),
279         ))
280     }
281 }
282 
283 #[cfg(test)]
284 mod tests {
285     use super::*;
286 
287     #[test]
read_uxx()288     fn read_uxx() {
289         let mut stream = IStream::create(&[1, 2, 3, 4, 5, 6, 7, 8]);
290         assert_eq!(stream.read_uxx(0), Ok(0));
291         assert_eq!(stream.offset, 0);
292         assert_eq!(stream.read_uxx(1), Ok(1));
293         assert_eq!(stream.offset, 1);
294         stream.offset = 0;
295         assert_eq!(stream.read_uxx(2), Ok(258));
296         stream.offset = 0;
297         assert_eq!(stream.read_u16(), Ok(258));
298         stream.offset = 0;
299         assert_eq!(stream.read_uxx(3), Ok(66051));
300         stream.offset = 0;
301         assert_eq!(stream.read_u24(), Ok(66051));
302         stream.offset = 0;
303         assert_eq!(stream.read_uxx(4), Ok(16909060));
304         stream.offset = 0;
305         assert_eq!(stream.read_u32(), Ok(16909060));
306         stream.offset = 0;
307         assert_eq!(stream.read_uxx(5), Ok(4328719365));
308         stream.offset = 0;
309         assert_eq!(stream.read_uxx(6), Ok(1108152157446));
310         stream.offset = 0;
311         assert_eq!(stream.read_uxx(7), Ok(283686952306183));
312         stream.offset = 0;
313         assert_eq!(stream.read_uxx(8), Ok(72623859790382856));
314         stream.offset = 0;
315         assert_eq!(stream.read_u64(), Ok(72623859790382856));
316         stream.offset = 0;
317         assert_eq!(stream.read_uxx(9), Err(AvifError::NotImplemented));
318     }
319 
320     #[test]
read_string()321     fn read_string() {
322         let bytes = "abcd\0e".as_bytes();
323         assert_eq!(IStream::create(bytes).read_string(4), Ok("abcd".into()));
324         assert_eq!(IStream::create(bytes).read_string(5), Ok("abcd\0".into()));
325         assert_eq!(IStream::create(bytes).read_string(6), Ok("abcd\0e".into()));
326         assert!(matches!(
327             IStream::create(bytes).read_string(8),
328             Err(AvifError::BmffParseFailed(_))
329         ));
330         assert_eq!(IStream::create(bytes).read_c_string(), Ok("abcd".into()));
331     }
332 }
333