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