use media_codec_h264::{
nal::NalUnitType,
pps::Pps,
ps::ParameterSets,
slice::{SliceHeader, SliceType},
sps::Sps,
};
#[rustfmt::skip]
const SPS_DATA: &[u8] = &[
0x42, 0xC0, 0x0A, 0xDA, 0x0B, 0x13, 0x90, ];
#[rustfmt::skip]
const PPS_DATA: &[u8] = &[
0xCE, 0x38, ];
#[rustfmt::skip]
const IDR_SLICE_HEADER: &[u8] = &[
0xB8, 0x40, 0x80, ];
#[test]
fn test_parse_idr_slice_header() {
let sps = Sps::parse(SPS_DATA).unwrap();
let pps = Pps::parse_with_sps(PPS_DATA, &sps).unwrap();
let mut param_sets = ParameterSets::new();
param_sets.add_sps(sps);
param_sets.add_pps(pps).unwrap();
let header = SliceHeader::parse(
IDR_SLICE_HEADER,
NalUnitType::SliceIdr,
3, ¶m_sets,
)
.unwrap();
assert_eq!(header.first_mb_in_slice, 0);
assert_eq!(header.slice_type, SliceType::I);
assert_eq!(header.pic_parameter_set_id, 0);
assert!(header.is_first_mb_in_pic());
assert!(header.is_frame());
assert!(!header.is_field_pic());
}
#[test]
fn test_slice_type_from_u8() {
assert_eq!(SliceType::from_u8(0), Some(SliceType::P));
assert_eq!(SliceType::from_u8(1), Some(SliceType::B));
assert_eq!(SliceType::from_u8(2), Some(SliceType::I));
assert_eq!(SliceType::from_u8(3), Some(SliceType::SP));
assert_eq!(SliceType::from_u8(4), Some(SliceType::SI));
assert_eq!(SliceType::from_u8(5), Some(SliceType::P));
assert_eq!(SliceType::from_u8(6), Some(SliceType::B));
assert_eq!(SliceType::from_u8(7), Some(SliceType::I));
assert_eq!(SliceType::from_u8(8), Some(SliceType::SP));
assert_eq!(SliceType::from_u8(9), Some(SliceType::SI));
}
#[test]
fn test_slice_type_properties() {
assert!(SliceType::I.is_intra());
assert!(SliceType::SI.is_intra());
assert!(!SliceType::P.is_intra());
assert!(!SliceType::B.is_intra());
assert!(!SliceType::SP.is_intra());
}