1 // Copyright 2024 The ChromiumOS Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 use std::borrow::Cow; 6 use std::fmt; 7 use std::io::Cursor; 8 use std::io::Read; 9 use std::io::Seek; 10 use std::io::SeekFrom; 11 use std::io::Write; 12 use std::marker::PhantomData; 13 14 use crate::codec::h264::parser::Nalu as H264Nalu; 15 use crate::codec::h265::parser::Nalu as H265Nalu; 16 17 /// A bit reader for codec bitstreams. It properly handles emulation-prevention 18 /// bytes and stop bits for H264. 19 #[derive(Clone)] 20 pub(crate) struct BitReader<'a> { 21 /// A reference into the next unread byte in the stream. 22 data: Cursor<&'a [u8]>, 23 /// Contents of the current byte. First unread bit starting at position 8 - 24 /// num_remaining_bits_in_curr_bytes. 25 curr_byte: u8, 26 /// Number of bits remaining in `curr_byte` 27 num_remaining_bits_in_curr_byte: usize, 28 /// Used in emulation prevention byte detection. 29 prev_two_bytes: u16, 30 /// Number of emulation prevention bytes (i.e. 0x000003) we found. 31 num_epb: usize, 32 /// Whether or not we need emulation prevention logic. 33 needs_epb: bool, 34 /// How many bits have been read so far. 35 position: u64, 36 } 37 38 #[derive(Debug)] 39 pub(crate) enum GetByteError { 40 OutOfBits, 41 } 42 43 impl fmt::Display for GetByteError { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result44 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 45 write!(f, "reader ran out of bits") 46 } 47 } 48 49 #[derive(Debug)] 50 pub(crate) enum ReadBitsError { 51 TooManyBitsRequested(usize), 52 GetByte(GetByteError), 53 ConversionFailed, 54 } 55 56 impl fmt::Display for ReadBitsError { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result57 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 58 match self { 59 ReadBitsError::TooManyBitsRequested(bits) => { 60 write!(f, "more than 31 ({}) bits were requested", bits) 61 } 62 ReadBitsError::GetByte(_) => write!(f, "failed to advance the current byte"), 63 ReadBitsError::ConversionFailed => { 64 write!(f, "failed to convert read input to target type") 65 } 66 } 67 } 68 } 69 70 impl From<GetByteError> for ReadBitsError { from(err: GetByteError) -> Self71 fn from(err: GetByteError) -> Self { 72 ReadBitsError::GetByte(err) 73 } 74 } 75 76 impl<'a> BitReader<'a> { new(data: &'a [u8], needs_epb: bool) -> Self77 pub fn new(data: &'a [u8], needs_epb: bool) -> Self { 78 Self { 79 data: Cursor::new(data), 80 curr_byte: Default::default(), 81 num_remaining_bits_in_curr_byte: Default::default(), 82 prev_two_bytes: 0xffff, 83 num_epb: Default::default(), 84 needs_epb: needs_epb, 85 position: 0, 86 } 87 } 88 89 /// Read a single bit from the stream. read_bit(&mut self) -> Result<bool, String>90 pub fn read_bit(&mut self) -> Result<bool, String> { 91 let bit = self.read_bits::<u32>(1)?; 92 match bit { 93 1 => Ok(true), 94 0 => Ok(false), 95 _ => panic!("Unexpected value {}", bit), 96 } 97 } 98 99 /// Read up to 31 bits from the stream. Note that we don't want to read 32 100 /// bits even though we're returning a u32 because that would break the 101 /// read_bits_signed() function. 31 bits should be overkill for compressed 102 /// header parsing anyway. read_bits<U: TryFrom<u32>>(&mut self, num_bits: usize) -> Result<U, String>103 pub fn read_bits<U: TryFrom<u32>>(&mut self, num_bits: usize) -> Result<U, String> { 104 if num_bits > 31 { 105 return Err(ReadBitsError::TooManyBitsRequested(num_bits).to_string()); 106 } 107 108 let mut bits_left = num_bits; 109 let mut out = 0u32; 110 111 while self.num_remaining_bits_in_curr_byte < bits_left { 112 out |= (self.curr_byte as u32) << (bits_left - self.num_remaining_bits_in_curr_byte); 113 bits_left -= self.num_remaining_bits_in_curr_byte; 114 self.move_to_next_byte().map_err(|err| err.to_string())?; 115 } 116 117 out |= (self.curr_byte >> (self.num_remaining_bits_in_curr_byte - bits_left)) as u32; 118 out &= (1 << num_bits) - 1; 119 self.num_remaining_bits_in_curr_byte -= bits_left; 120 self.position += num_bits as u64; 121 122 U::try_from(out).map_err(|_| ReadBitsError::ConversionFailed.to_string()) 123 } 124 125 /// Reads a two's complement signed integer of length |num_bits|. read_bits_signed<U: TryFrom<i32>>(&mut self, num_bits: usize) -> Result<U, String>126 pub fn read_bits_signed<U: TryFrom<i32>>(&mut self, num_bits: usize) -> Result<U, String> { 127 let mut out: i32 = self 128 .read_bits::<u32>(num_bits)? 129 .try_into() 130 .map_err(|_| ReadBitsError::ConversionFailed.to_string())?; 131 if out >> (num_bits - 1) != 0 { 132 out |= -1i32 ^ ((1 << num_bits) - 1); 133 } 134 135 U::try_from(out).map_err(|_| ReadBitsError::ConversionFailed.to_string()) 136 } 137 138 /// Reads an unsigned integer from the stream and checks if the stream is byte aligned. read_bits_aligned<U: TryFrom<u32>>(&mut self, num_bits: usize) -> Result<U, String>139 pub fn read_bits_aligned<U: TryFrom<u32>>(&mut self, num_bits: usize) -> Result<U, String> { 140 if self.num_remaining_bits_in_curr_byte % 8 != 0 { 141 return Err("Attempted unaligned read_le()".into()); 142 } 143 144 Ok(self.read_bits(num_bits).map_err(|err| err.to_string())?) 145 } 146 147 /// Skip `num_bits` bits from the stream. skip_bits(&mut self, mut num_bits: usize) -> Result<(), String>148 pub fn skip_bits(&mut self, mut num_bits: usize) -> Result<(), String> { 149 while num_bits > 0 { 150 let n = std::cmp::min(num_bits, 31); 151 self.read_bits::<u32>(n)?; 152 num_bits -= n; 153 } 154 155 Ok(()) 156 } 157 158 /// Returns the amount of bits left in the stream num_bits_left(&mut self) -> usize159 pub fn num_bits_left(&mut self) -> usize { 160 let cur_pos = self.data.position(); 161 // This should always be safe to unwrap. 162 let end_pos = self.data.seek(SeekFrom::End(0)).unwrap(); 163 let _ = self.data.seek(SeekFrom::Start(cur_pos)); 164 ((end_pos - cur_pos) as usize) * 8 + self.num_remaining_bits_in_curr_byte 165 } 166 167 /// Returns the number of emulation-prevention bytes read so far. num_epb(&self) -> usize168 pub fn num_epb(&self) -> usize { 169 self.num_epb 170 } 171 172 /// Whether the stream still has RBSP data. Implements more_rbsp_data(). See 173 /// the spec for more details. has_more_rsbp_data(&mut self) -> bool174 pub fn has_more_rsbp_data(&mut self) -> bool { 175 if self.num_remaining_bits_in_curr_byte == 0 && self.move_to_next_byte().is_err() { 176 // no more data at all in the rbsp 177 return false; 178 } 179 180 // If the next bit is the stop bit, then we should only see unset bits 181 // until the end of the data. 182 if (self.curr_byte & ((1 << (self.num_remaining_bits_in_curr_byte - 1)) - 1)) != 0 { 183 return true; 184 } 185 186 let mut buf = [0u8; 1]; 187 let orig_pos = self.data.position(); 188 while let Ok(_) = self.data.read_exact(&mut buf) { 189 if buf[0] != 0 { 190 self.data.set_position(orig_pos); 191 return true; 192 } 193 } 194 false 195 } 196 197 /// Reads an Unsigned Exponential golomb coding number from the next bytes in the 198 /// bitstream. This may advance the state of position within the bitstream even if the 199 /// read operation is unsuccessful. See H264 Annex B specification 9.1 for details. read_ue<U: TryFrom<u32>>(&mut self) -> Result<U, String>200 pub fn read_ue<U: TryFrom<u32>>(&mut self) -> Result<U, String> { 201 let mut num_bits = 0; 202 203 while self.read_bits::<u32>(1)? == 0 { 204 num_bits += 1; 205 if num_bits > 31 { 206 return Err("invalid stream".into()); 207 } 208 } 209 210 let value = ((1u32 << num_bits) - 1) 211 .checked_add(self.read_bits::<u32>(num_bits)?) 212 .ok_or::<String>("read number cannot fit in 32 bits".into())?; 213 214 U::try_from(value).map_err(|_| "conversion error".into()) 215 } 216 read_ue_bounded<U: TryFrom<u32>>(&mut self, min: u32, max: u32) -> Result<U, String>217 pub fn read_ue_bounded<U: TryFrom<u32>>(&mut self, min: u32, max: u32) -> Result<U, String> { 218 let ue = self.read_ue()?; 219 if ue > max || ue < min { 220 Err(format!("Value out of bounds: expected {} - {}, got {}", min, max, ue)) 221 } else { 222 Ok(U::try_from(ue).map_err(|_| String::from("Conversion error"))?) 223 } 224 } 225 read_ue_max<U: TryFrom<u32>>(&mut self, max: u32) -> Result<U, String>226 pub fn read_ue_max<U: TryFrom<u32>>(&mut self, max: u32) -> Result<U, String> { 227 self.read_ue_bounded(0, max) 228 } 229 230 /// Reads a signed exponential golomb coding number. Instead of using two's 231 /// complement, this scheme maps even integers to positive numbers and odd 232 /// integers to negative numbers. The least significant bit indicates the 233 /// sign. See H264 Annex B specification 9.1.1 for details. read_se<U: TryFrom<i32>>(&mut self) -> Result<U, String>234 pub fn read_se<U: TryFrom<i32>>(&mut self) -> Result<U, String> { 235 let ue = self.read_ue::<u32>()? as i32; 236 237 if ue % 2 == 0 { 238 Ok(U::try_from(-(ue / 2)).map_err(|_| String::from("Conversion error"))?) 239 } else { 240 Ok(U::try_from(ue / 2 + 1).map_err(|_| String::from("Conversion error"))?) 241 } 242 } 243 read_se_bounded<U: TryFrom<i32>>(&mut self, min: i32, max: i32) -> Result<U, String>244 pub fn read_se_bounded<U: TryFrom<i32>>(&mut self, min: i32, max: i32) -> Result<U, String> { 245 let se = self.read_se()?; 246 if se < min || se > max { 247 Err(format!("Value out of bounds, expected between {}-{}, got {}", min, max, se)) 248 } else { 249 Ok(U::try_from(se).map_err(|_| String::from("Conversion error"))?) 250 } 251 } 252 253 /// Read little endian multi-byte integer. read_le<U: TryFrom<u32>>(&mut self, num_bits: u8) -> Result<U, String>254 pub fn read_le<U: TryFrom<u32>>(&mut self, num_bits: u8) -> Result<U, String> { 255 let mut t = 0; 256 257 for i in 0..num_bits { 258 let byte = self.read_bits_aligned::<u32>(8)?; 259 t += byte << (i * 8) 260 } 261 262 Ok(U::try_from(t).map_err(|_| String::from("Conversion error"))?) 263 } 264 265 /// Return the position of this bitstream in bits. position(&self) -> u64266 pub fn position(&self) -> u64 { 267 self.position 268 } 269 get_byte(&mut self) -> Result<u8, GetByteError>270 fn get_byte(&mut self) -> Result<u8, GetByteError> { 271 let mut buf = [0u8; 1]; 272 self.data.read_exact(&mut buf).map_err(|_| GetByteError::OutOfBits)?; 273 Ok(buf[0]) 274 } 275 move_to_next_byte(&mut self) -> Result<(), GetByteError>276 fn move_to_next_byte(&mut self) -> Result<(), GetByteError> { 277 let mut byte = self.get_byte()?; 278 279 if self.needs_epb { 280 if self.prev_two_bytes == 0 && byte == 0x03 { 281 // We found an epb 282 self.num_epb += 1; 283 // Read another byte 284 byte = self.get_byte()?; 285 // We need another 3 bytes before another epb can happen. 286 self.prev_two_bytes = 0xffff; 287 } 288 self.prev_two_bytes = (self.prev_two_bytes << 8) | u16::from(byte); 289 } 290 291 self.num_remaining_bits_in_curr_byte = 8; 292 self.curr_byte = byte; 293 Ok(()) 294 } 295 } 296 297 /// Iterator over IVF packets. 298 pub struct IvfIterator<'a> { 299 cursor: Cursor<&'a [u8]>, 300 } 301 302 impl<'a> IvfIterator<'a> { new(data: &'a [u8]) -> Self303 pub fn new(data: &'a [u8]) -> Self { 304 let mut cursor = Cursor::new(data); 305 306 // Skip the IVH header entirely. 307 cursor.seek(std::io::SeekFrom::Start(32)).unwrap(); 308 309 Self { cursor } 310 } 311 } 312 313 impl<'a> Iterator for IvfIterator<'a> { 314 type Item = &'a [u8]; 315 next(&mut self) -> Option<Self::Item>316 fn next(&mut self) -> Option<Self::Item> { 317 // Make sure we have a header. 318 let mut len_buf = [0u8; 4]; 319 self.cursor.read_exact(&mut len_buf).ok()?; 320 let len = ((len_buf[3] as usize) << 24) 321 | ((len_buf[2] as usize) << 16) 322 | ((len_buf[1] as usize) << 8) 323 | (len_buf[0] as usize); 324 325 // Skip PTS. 326 self.cursor.seek(std::io::SeekFrom::Current(8)).ok()?; 327 328 let start = self.cursor.position() as usize; 329 let _ = self.cursor.seek(std::io::SeekFrom::Current(len as i64)).ok()?; 330 let end = self.cursor.position() as usize; 331 332 Some(&self.cursor.get_ref()[start..end]) 333 } 334 } 335 336 /// Helper struct for synthesizing IVF file header 337 pub struct IvfFileHeader { 338 pub magic: [u8; 4], 339 pub version: u16, 340 pub header_size: u16, 341 pub codec: [u8; 4], 342 pub width: u16, 343 pub height: u16, 344 pub framerate: u32, 345 pub timescale: u32, 346 pub frame_count: u32, 347 pub unused: u32, 348 } 349 350 impl Default for IvfFileHeader { default() -> Self351 fn default() -> Self { 352 Self { 353 magic: Self::MAGIC, 354 version: 0, 355 header_size: 32, 356 codec: Self::CODEC_VP9, 357 width: 320, 358 height: 240, 359 framerate: 1, 360 timescale: 1000, 361 frame_count: 1, 362 unused: Default::default(), 363 } 364 } 365 } 366 367 impl IvfFileHeader { 368 pub const MAGIC: [u8; 4] = *b"DKIF"; 369 pub const CODEC_VP8: [u8; 4] = *b"VP80"; 370 pub const CODEC_VP9: [u8; 4] = *b"VP90"; 371 pub const CODEC_AV1: [u8; 4] = *b"AV01"; 372 new(codec: [u8; 4], width: u16, height: u16, framerate: u32, frame_count: u32) -> Self373 pub fn new(codec: [u8; 4], width: u16, height: u16, framerate: u32, frame_count: u32) -> Self { 374 let default = Self::default(); 375 376 Self { 377 codec, 378 width, 379 height, 380 framerate: framerate * default.timescale, 381 frame_count, 382 ..default 383 } 384 } 385 } 386 387 impl IvfFileHeader { 388 /// Writes header into writer writo_into(&self, writer: &mut impl std::io::Write) -> std::io::Result<()>389 pub fn writo_into(&self, writer: &mut impl std::io::Write) -> std::io::Result<()> { 390 writer.write_all(&self.magic)?; 391 writer.write_all(&self.version.to_le_bytes())?; 392 writer.write_all(&self.header_size.to_le_bytes())?; 393 writer.write_all(&self.codec)?; 394 writer.write_all(&self.width.to_le_bytes())?; 395 writer.write_all(&self.height.to_le_bytes())?; 396 writer.write_all(&self.framerate.to_le_bytes())?; 397 writer.write_all(&self.timescale.to_le_bytes())?; 398 writer.write_all(&self.frame_count.to_le_bytes())?; 399 writer.write_all(&self.unused.to_le_bytes())?; 400 401 Ok(()) 402 } 403 } 404 405 /// Helper struct for synthesizing IVF frame header 406 pub struct IvfFrameHeader { 407 pub frame_size: u32, 408 pub timestamp: u64, 409 } 410 411 impl IvfFrameHeader { 412 /// Writes header into writer writo_into(&self, writer: &mut impl std::io::Write) -> std::io::Result<()>413 pub fn writo_into(&self, writer: &mut impl std::io::Write) -> std::io::Result<()> { 414 writer.write_all(&self.frame_size.to_le_bytes())?; 415 writer.write_all(&self.timestamp.to_le_bytes())?; 416 Ok(()) 417 } 418 } 419 420 /// Iterator NALUs in a bitstream. 421 pub struct NalIterator<'a, Nalu>(Cursor<&'a [u8]>, PhantomData<Nalu>); 422 423 impl<'a, Nalu> NalIterator<'a, Nalu> { new(stream: &'a [u8]) -> Self424 pub fn new(stream: &'a [u8]) -> Self { 425 Self(Cursor::new(stream), PhantomData) 426 } 427 } 428 429 impl<'a> Iterator for NalIterator<'a, H264Nalu<'a>> { 430 type Item = Cow<'a, [u8]>; 431 next(&mut self) -> Option<Self::Item>432 fn next(&mut self) -> Option<Self::Item> { 433 H264Nalu::next(&mut self.0).map(|n| n.data).ok() 434 } 435 } 436 437 impl<'a> Iterator for NalIterator<'a, H265Nalu<'a>> { 438 type Item = Cow<'a, [u8]>; 439 next(&mut self) -> Option<Self::Item>440 fn next(&mut self) -> Option<Self::Item> { 441 H265Nalu::next(&mut self.0).map(|n| n.data).ok() 442 } 443 } 444 445 #[derive(Debug)] 446 pub enum BitWriterError { 447 InvalidBitCount, 448 Io(std::io::Error), 449 } 450 451 impl fmt::Display for BitWriterError { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result452 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 453 match self { 454 BitWriterError::InvalidBitCount => write!(f, "invalid bit count"), 455 BitWriterError::Io(x) => write!(f, "{}", x.to_string()), 456 } 457 } 458 } 459 460 impl From<std::io::Error> for BitWriterError { from(err: std::io::Error) -> Self461 fn from(err: std::io::Error) -> Self { 462 BitWriterError::Io(err) 463 } 464 } 465 466 pub type BitWriterResult<T> = std::result::Result<T, BitWriterError>; 467 468 pub struct BitWriter<W: Write> { 469 out: W, 470 nth_bit: u8, 471 curr_byte: u8, 472 } 473 474 impl<W: Write> BitWriter<W> { new(writer: W) -> Self475 pub fn new(writer: W) -> Self { 476 Self { out: writer, curr_byte: 0, nth_bit: 0 } 477 } 478 479 /// Writes fixed bit size integer (up to 32 bit) write_f<T: Into<u32>>(&mut self, bits: usize, value: T) -> BitWriterResult<usize>480 pub fn write_f<T: Into<u32>>(&mut self, bits: usize, value: T) -> BitWriterResult<usize> { 481 let value = value.into(); 482 483 if bits > 32 { 484 return Err(BitWriterError::InvalidBitCount); 485 } 486 487 let mut written = 0; 488 for bit in (0..bits).rev() { 489 let bit = (1 << bit) as u32; 490 491 self.write_bit((value & bit) == bit)?; 492 written += 1; 493 } 494 495 Ok(written) 496 } 497 498 /// Takes a single bit that will be outputed to [`std::io::Write`] write_bit(&mut self, bit: bool) -> BitWriterResult<()>499 pub fn write_bit(&mut self, bit: bool) -> BitWriterResult<()> { 500 self.curr_byte |= (bit as u8) << (7u8 - self.nth_bit); 501 self.nth_bit += 1; 502 503 if self.nth_bit == 8 { 504 self.out.write_all(&[self.curr_byte])?; 505 self.nth_bit = 0; 506 self.curr_byte = 0; 507 } 508 509 Ok(()) 510 } 511 512 /// Immediately outputs any cached bits to [`std::io::Write`] flush(&mut self) -> BitWriterResult<()>513 pub fn flush(&mut self) -> BitWriterResult<()> { 514 if self.nth_bit != 0 { 515 self.out.write_all(&[self.curr_byte])?; 516 self.nth_bit = 0; 517 self.curr_byte = 0; 518 } 519 520 self.out.flush()?; 521 Ok(()) 522 } 523 524 /// Returns `true` if ['Self`] hold data that wasn't written to [`std::io::Write`] has_data_pending(&self) -> bool525 pub fn has_data_pending(&self) -> bool { 526 self.nth_bit != 0 527 } 528 inner(&self) -> &W529 pub(crate) fn inner(&self) -> &W { 530 &self.out 531 } 532 inner_mut(&mut self) -> &mut W533 pub(crate) fn inner_mut(&mut self) -> &mut W { 534 &mut self.out 535 } 536 } 537 538 impl<W: Write> Drop for BitWriter<W> { drop(&mut self)539 fn drop(&mut self) { 540 if let Err(e) = self.flush() { 541 log::error!("Unable to flush bits {e:?}"); 542 } 543 } 544 } 545 546 #[cfg(test)] 547 mod tests { 548 use super::*; 549 550 #[test] test_ivf_file_header()551 fn test_ivf_file_header() { 552 let mut hdr = IvfFileHeader { 553 version: 0, 554 codec: IvfFileHeader::CODEC_VP9, 555 width: 256, 556 height: 256, 557 framerate: 30_000, 558 timescale: 1_000, 559 frame_count: 1, 560 561 ..Default::default() 562 }; 563 564 let mut buf = Vec::new(); 565 hdr.writo_into(&mut buf).unwrap(); 566 567 const EXPECTED: [u8; 32] = [ 568 0x44, 0x4b, 0x49, 0x46, 0x00, 0x00, 0x20, 0x00, 0x56, 0x50, 0x39, 0x30, 0x00, 0x01, 569 0x00, 0x01, 0x30, 0x75, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 570 0x00, 0x00, 0x00, 0x00, 571 ]; 572 573 assert_eq!(&buf, &EXPECTED); 574 575 hdr.width = 1920; 576 hdr.height = 800; 577 hdr.framerate = 24; 578 hdr.timescale = 1; 579 hdr.frame_count = 100; 580 581 buf.clear(); 582 hdr.writo_into(&mut buf).unwrap(); 583 584 const EXPECTED2: [u8; 32] = [ 585 0x44, 0x4b, 0x49, 0x46, 0x00, 0x00, 0x20, 0x00, 0x56, 0x50, 0x39, 0x30, 0x80, 0x07, 586 0x20, 0x03, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 587 0x00, 0x00, 0x00, 0x00, 588 ]; 589 590 assert_eq!(&buf, &EXPECTED2); 591 } 592 593 #[test] test_ivf_frame_header()594 fn test_ivf_frame_header() { 595 let mut hdr = IvfFrameHeader { frame_size: 199249, timestamp: 0 }; 596 597 let mut buf = Vec::new(); 598 hdr.writo_into(&mut buf).unwrap(); 599 600 const EXPECTED: [u8; 12] = 601 [0x51, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; 602 603 assert_eq!(&buf, &EXPECTED); 604 605 hdr.timestamp = 1; 606 hdr.frame_size = 52; 607 608 buf.clear(); 609 hdr.writo_into(&mut buf).unwrap(); 610 611 const EXPECTED2: [u8; 12] = 612 [0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; 613 614 assert_eq!(&buf, &EXPECTED2); 615 } 616 617 #[test] test_bitwriter_f1()618 fn test_bitwriter_f1() { 619 let mut buf = Vec::<u8>::new(); 620 { 621 let mut writer = BitWriter::new(&mut buf); 622 writer.write_f(1, true).unwrap(); 623 writer.write_f(1, false).unwrap(); 624 writer.write_f(1, false).unwrap(); 625 writer.write_f(1, false).unwrap(); 626 writer.write_f(1, true).unwrap(); 627 writer.write_f(1, true).unwrap(); 628 writer.write_f(1, true).unwrap(); 629 writer.write_f(1, true).unwrap(); 630 } 631 assert_eq!(buf, vec![0b10001111u8]); 632 } 633 634 #[test] test_bitwriter_f3()635 fn test_bitwriter_f3() { 636 let mut buf = Vec::<u8>::new(); 637 { 638 let mut writer = BitWriter::new(&mut buf); 639 writer.write_f(3, 0b100u8).unwrap(); 640 writer.write_f(3, 0b101u8).unwrap(); 641 writer.write_f(3, 0b011u8).unwrap(); 642 } 643 assert_eq!(buf, vec![0b10010101u8, 0b10000000u8]); 644 } 645 646 #[test] test_bitwriter_f4()647 fn test_bitwriter_f4() { 648 let mut buf = Vec::<u8>::new(); 649 { 650 let mut writer = BitWriter::new(&mut buf); 651 writer.write_f(4, 0b1000u8).unwrap(); 652 writer.write_f(4, 0b1011u8).unwrap(); 653 } 654 assert_eq!(buf, vec![0b10001011u8]); 655 } 656 657 // These tests are adapted from the chromium tests at media/video/h264_bit_reader_unitttest.cc 658 659 #[test] read_stream_without_escape_and_trailing_zero_bytes()660 fn read_stream_without_escape_and_trailing_zero_bytes() { 661 const RBSP: [u8; 6] = [0x01, 0x23, 0x45, 0x67, 0x89, 0xa0]; 662 663 let mut reader = BitReader::new(&RBSP, true); 664 assert_eq!(reader.read_bits::<u32>(1).unwrap(), 0); 665 assert_eq!(reader.num_bits_left(), 47); 666 assert!(reader.has_more_rsbp_data()); 667 668 assert_eq!(reader.read_bits::<u32>(8).unwrap(), 0x02); 669 assert_eq!(reader.num_bits_left(), 39); 670 assert!(reader.has_more_rsbp_data()); 671 672 assert_eq!(reader.read_bits::<u32>(31).unwrap(), 0x23456789); 673 assert_eq!(reader.num_bits_left(), 8); 674 assert!(reader.has_more_rsbp_data()); 675 676 assert_eq!(reader.read_bits::<u32>(1).unwrap(), 1); 677 assert_eq!(reader.num_bits_left(), 7); 678 assert!(reader.has_more_rsbp_data()); 679 680 assert_eq!(reader.read_bits::<u32>(1).unwrap(), 0); 681 assert_eq!(reader.num_bits_left(), 6); 682 assert!(!reader.has_more_rsbp_data()); 683 } 684 685 #[test] single_byte_stream()686 fn single_byte_stream() { 687 const RBSP: [u8; 1] = [0x18]; 688 689 let mut reader = BitReader::new(&RBSP, true); 690 assert_eq!(reader.num_bits_left(), 8); 691 assert!(reader.has_more_rsbp_data()); 692 assert_eq!(reader.read_bits::<u32>(4).unwrap(), 1); 693 assert!(!reader.has_more_rsbp_data()); 694 } 695 696 #[test] stop_bit_occupy_full_byte()697 fn stop_bit_occupy_full_byte() { 698 const RBSP: [u8; 2] = [0xab, 0x80]; 699 700 let mut reader = BitReader::new(&RBSP, true); 701 assert_eq!(reader.num_bits_left(), 16); 702 assert!(reader.has_more_rsbp_data()); 703 704 assert_eq!(reader.read_bits::<u32>(8).unwrap(), 0xab); 705 assert_eq!(reader.num_bits_left(), 8); 706 707 assert!(!reader.has_more_rsbp_data()); 708 } 709 710 // Check that read_ue behaves properly with input at the limits. 711 #[test] read_ue()712 fn read_ue() { 713 // Regular value. 714 let mut reader = BitReader::new(&[0b0001_1010], true); 715 assert_eq!(reader.read_ue::<u32>().unwrap(), 12); 716 assert_eq!(reader.data.position(), 1); 717 assert_eq!(reader.num_remaining_bits_in_curr_byte, 1); 718 719 // 0 value. 720 let mut reader = BitReader::new(&[0b1000_0000], true); 721 assert_eq!(reader.read_ue::<u32>().unwrap(), 0); 722 assert_eq!(reader.data.position(), 1); 723 assert_eq!(reader.num_remaining_bits_in_curr_byte, 7); 724 725 // No prefix stop bit. 726 let mut reader = BitReader::new(&[0b0000_0000], true); 727 reader.read_ue::<u32>().unwrap_err(); 728 729 // u32 max value: 31 0-bits, 1 bit marker, 31 bits 1-bits. 730 let mut reader = BitReader::new( 731 &[ 732 0b0000_0000, 733 0b0000_0000, 734 0b0000_0000, 735 0b0000_0001, 736 0b1111_1111, 737 0b1111_1111, 738 0b1111_1111, 739 0b1111_1110, 740 ], 741 true, 742 ); 743 assert_eq!(reader.read_ue::<u32>().unwrap(), 0xffff_fffe); 744 assert_eq!(reader.data.position(), 8); 745 assert_eq!(reader.num_remaining_bits_in_curr_byte, 1); 746 } 747 748 // Check that emulation prevention is being handled correctly. 749 #[test] skip_epb_when_enabled()750 fn skip_epb_when_enabled() { 751 let mut reader = BitReader::new(&[0x00, 0x00, 0x03, 0x01], false); 752 assert_eq!(reader.read_bits::<u32>(8).unwrap(), 0x00); 753 assert_eq!(reader.read_bits::<u32>(8).unwrap(), 0x00); 754 assert_eq!(reader.read_bits::<u32>(8).unwrap(), 0x03); 755 assert_eq!(reader.read_bits::<u32>(8).unwrap(), 0x01); 756 757 let mut reader = BitReader::new(&[0x00, 0x00, 0x03, 0x01], true); 758 assert_eq!(reader.read_bits::<u32>(8).unwrap(), 0x00); 759 assert_eq!(reader.read_bits::<u32>(8).unwrap(), 0x00); 760 assert_eq!(reader.read_bits::<u32>(8).unwrap(), 0x01); 761 } 762 763 #[test] read_signed_bits()764 fn read_signed_bits() { 765 let mut reader = BitReader::new(&[0b1111_0000], false); 766 assert_eq!(reader.read_bits_signed::<i32>(4).unwrap(), -1); 767 } 768 } 769