use std::io::Cursor;
use media_codec_bitstream::{BigEndian, BitReader};
#[inline]
pub fn from_slice_be<'a>(data: &'a [u8]) -> BitReader<Cursor<&'a [u8]>, BigEndian> {
BitReader::new(Cursor::new(data))
}
#[test]
fn test_read_ue() {
let test_cases: &[(&[u8], u32)] = &[
(&[0b10000000], 0), (&[0b01000000], 1), (&[0b01100000], 2), (&[0b00100000], 3), (&[0b00101000], 4), (&[0b00110000], 5), (&[0b00111000], 6), (&[0b00010000], 7), (&[0b00010010], 8), (&[0b00010100], 9), (&[0b00010110], 10), (&[0b00011000], 11), (&[0b00011010], 12), (&[0b00011100], 13), (&[0b00011110], 14), ];
for (data, expected) in test_cases {
let mut reader = from_slice_be(data);
let value = reader.read_ue().unwrap();
assert_eq!(value, *expected, "data: {:08b}, expected: {}", data[0], expected);
}
}
#[test]
fn test_read_se() {
let test_cases: &[(&[u8], i32)] = &[
(&[0b10000000], 0), (&[0b01000000], 1), (&[0b01100000], -1), (&[0b00100000], 2), (&[0b00101000], -2), (&[0b00110000], 3), (&[0b00111000], -3), ];
for (data, expected) in test_cases {
let mut reader = from_slice_be(data);
let value = reader.read_se().unwrap();
assert_eq!(value, *expected, "data: {:08b}, expected: {}", data[0], expected);
}
}
#[test]
fn test_peek_bits() {
let data = [0b10110001, 0b01010101];
let mut reader = from_slice_be(&data);
assert_eq!(reader.peek::<4, u8>().unwrap(), 0b1011);
assert_eq!(reader.peek::<4, u8>().unwrap(), 0b1011);
assert_eq!(reader.peek::<8, u8>().unwrap(), 0b10110001);
assert_eq!(reader.read::<4, u8>().unwrap(), 0b1011);
assert_eq!(reader.peek::<4, u8>().unwrap(), 0b0001);
}
#[test]
fn test_peek_ue() {
let data = [0b01000000]; let mut reader = from_slice_be(&data);
assert_eq!(reader.peek_ue().unwrap(), 1);
assert_eq!(reader.peek_ue().unwrap(), 1);
assert_eq!(reader.read_ue().unwrap(), 1);
}
#[test]
fn test_peek_se() {
let data = [0b01100000]; let mut reader = from_slice_be(&data);
assert_eq!(reader.peek_se().unwrap(), -1);
assert_eq!(reader.peek_se().unwrap(), -1);
assert_eq!(reader.read_se().unwrap(), -1);
}
#[test]
fn test_peek_var() {
let data = [0b10110001, 0b01010101];
let mut reader = from_slice_be(&data);
assert_eq!(reader.peek_var::<u8>(4).unwrap(), 0b1011);
assert_eq!(reader.peek_var::<u8>(4).unwrap(), 0b1011);
assert_eq!(reader.read_var::<u8>(4).unwrap(), 0b1011);
assert_eq!(reader.peek_var::<u8>(4).unwrap(), 0b0001);
}
#[test]
fn test_peek_bit() {
let data = [0b10110001];
let mut reader = from_slice_be(&data);
assert!(reader.peek_bit().unwrap());
assert!(reader.peek_bit().unwrap());
assert!(reader.read_bit().unwrap());
assert!(!reader.peek_bit().unwrap());
}