1 use super::*; 2 use std::io::Cursor; 3 4 #[test] 5 fn test_data_does_not_start_with_h264header() -> Result<()> { 6 let test_function = |input: &[u8]| { 7 let mut reader = H264Reader::new(Cursor::new(input)); 8 if let Err(err) = reader.next_nal() { 9 assert_eq!(Error::ErrDataIsNotH264Stream, err); 10 } else { 11 assert!(false); 12 } 13 }; 14 15 test_function(&[2]); 16 test_function(&[0, 2]); 17 test_function(&[0, 0, 2]); 18 test_function(&[0, 0, 2, 0]); 19 test_function(&[0, 0, 0, 2]); 20 21 Ok(()) 22 } 23 24 #[test] 25 fn test_parse_header() -> Result<()> { 26 let h264bytes = &[0x0, 0x0, 0x1, 0xAB]; 27 let mut reader = H264Reader::new(Cursor::new(h264bytes)); 28 29 let nal = reader.next_nal()?; 30 31 assert_eq!(1, nal.data.len()); 32 assert!(nal.forbidden_zero_bit); 33 assert_eq!(0, nal.picture_order_count); 34 assert_eq!(1, nal.ref_idc); 35 assert_eq!(NalUnitType::EndOfStream, nal.unit_type); 36 37 Ok(()) 38 } 39 40 #[test] 41 fn test_eof() -> Result<()> { 42 let test_function = |input: &[u8]| { 43 let mut reader = H264Reader::new(Cursor::new(input)); 44 if let Err(err) = reader.next_nal() { 45 assert_eq!(Error::ErrIoEOF, err); 46 } else { 47 assert!(false); 48 } 49 }; 50 51 test_function(&[0, 0, 0, 1]); 52 test_function(&[0, 0, 1]); 53 test_function(&[]); 54 55 Ok(()) 56 } 57 58 #[test] 59 fn test_skip_sei() -> Result<()> { 60 let h264bytes = &[ 61 0x0, 0x0, 0x0, 0x1, 0xAA, 0x0, 0x0, 0x0, 0x1, 0x6, // SEI 62 0x0, 0x0, 0x0, 0x1, 0xAB, 63 ]; 64 65 let mut reader = H264Reader::new(Cursor::new(h264bytes)); 66 67 let nal = reader.next_nal()?; 68 assert_eq!(0xAA, nal.data[0]); 69 70 let nal = reader.next_nal()?; 71 assert_eq!(0xAB, nal.data[0]); 72 73 Ok(()) 74 } 75 76 #[test] 77 fn test_issue1734_next_nal() -> Result<()> { 78 let tests: Vec<&[u8]> = vec![ 79 &[0x00, 0x00, 0x010, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01], 80 &[0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01], 81 ]; 82 83 for test in tests { 84 let mut reader = H264Reader::new(Cursor::new(test)); 85 86 // Just make sure it doesn't crash 87 while reader.next_nal().is_ok() { 88 //do nothing 89 } 90 } 91 92 Ok(()) 93 } 94 95 #[test] 96 fn test_trailing01after_start_code() -> Result<()> { 97 let test = vec![0x0, 0x0, 0x0, 0x1, 0x01, 0x0, 0x0, 0x0, 0x1, 0x01]; 98 let mut r = H264Reader::new(Cursor::new(test)); 99 100 for _ in 0..=1 { 101 let _nal = r.next_nal()?; 102 } 103 104 Ok(()) 105 } 106