libmpegts 0.3.2

MPEG-TS Library
Documentation
use libmpegts::{
    pack_bits,
    ts::{
        self,
        PACKET_SIZE,
        TsPacketMut,
        TsPacketRef,
    },
};
mod data;

#[test]
fn test_init() {
    let mut data = [0u8; PACKET_SIZE];
    let mut packet = TsPacketMut::from(&mut data);
    packet.init(256, 5);

    let expected = [0x47, 0x01, 0x00, 0x05];
    assert_eq!(&packet.as_ref()[.. 4], &expected);
}

#[test]
fn test_get_pid() {
    let packet = TsPacketRef::from(&[
        0x47, 0x41, 0x16, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    ]);
    assert_eq!(packet.pid(), 278);
}

#[test]
fn test_set_pid() {
    let mut data: Vec<u8> = vec![0x47, 0x00, 0x00, 0x00];
    data.resize(ts::PACKET_SIZE, 0xFF);

    let mut packet = TsPacketMut::try_from(data.as_mut_slice()).unwrap();
    packet.set_pid(8191);
    assert_eq!(&[0x1F, 0xFF], &packet.as_ref()[1 .. 3]);
}

#[test]
fn test_payload_offset() {
    let packet = TsPacketRef::from(&[
        0x47, 0x40, 0x11, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    ]);
    let payload = packet.payload().expect("payload should exist");
    assert_eq!(payload.len(), ts::PACKET_SIZE - 4);

    let packet = TsPacketRef::from(&[
        0x47, 0x40, 0x2d, 0xf0, 0x19, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    ]);
    let payload = packet.payload().expect("payload should exist");
    assert_eq!(payload.len(), ts::PACKET_SIZE - 4 - 1 - 0x19);
}

#[test]
fn test_set_payload() {
    let mut data = vec![0x47, 0x00, 0x00, 0x00];
    data.resize(ts::PACKET_SIZE, 0xFF);

    let mut packet = TsPacketMut::try_from(data.as_mut_slice()).unwrap();
    packet.set_payload();
    assert_eq!(packet.as_ref()[3], 0x10);
}

#[test]
fn test_clear_payload() {
    let mut data = vec![0x47, 0x00, 0x00, 0xFF];
    data.resize(ts::PACKET_SIZE, 0xFF);

    let mut packet = TsPacketMut::try_from(data.as_mut_slice()).unwrap();
    packet.clear_payload();
    assert_eq!(packet.as_ref()[3], 0xEF);
}

#[test]
fn test_set_pusi() {
    let mut data = vec![0x47, 0x00];
    data.resize(ts::PACKET_SIZE, 0xFF);

    let mut packet = TsPacketMut::try_from(data.as_mut_slice()).unwrap();
    packet.set_pusi();
    assert_eq!(packet.as_ref()[1], 0x40);
}

#[test]
fn test_clear_pusi() {
    let mut data = vec![0x47, 0xFF];
    data.resize(ts::PACKET_SIZE, 0xFF);

    let mut packet = TsPacketMut::try_from(data.as_mut_slice()).unwrap();
    packet.clear_pusi();
    assert_eq!(packet.as_ref()[1], 0xBF);
}

#[test]
fn test_adaptation_field() {
    // No adaptation field
    let packet = TsPacketRef::from(&[
        0x47, 0x40, 0x11, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    ]);
    assert!(packet.adaptation_field().is_none());

    // Empty adaptation field
    let packet = TsPacketRef::from(&[
        0x47, 0x40, 0x11, 0x20, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    ]);
    assert!(packet.adaptation_field().is_some());
    assert_eq!(packet.adaptation_field().unwrap().len(), 0)
}

#[test]
fn test_adaptation_field_pcr() {
    // Without PCR
    let packet = TsPacketRef::from(&[
        0x47, 0x41, 0x00, 0x20, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    ]);
    assert!(packet.adaptation_field().unwrap().pcr().is_none());

    // With PCR
    let data: [u8; ts::PACKET_SIZE] = [
        0x47, 0x41, 0x00, 0x20, 0xB7, 0x10, 0x00, 0x02, 0x32, 0x89, 0x7E, 0xF7, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    ];

    // Check PCR value
    {
        let data = data.clone();
        let packet = TsPacketRef::from(&data);
        println!("{:#?}", &packet);
        let adaptation_field = packet
            .adaptation_field()
            .expect("adaptation field should exist");
        assert_eq!(adaptation_field.pcr(), Some(86405647));
    }

    // Set PCR bytes to zero and check PCR value again
    {
        let mut data = data.clone();
        data[6 .. 13].copy_from_slice(
            &pack_bits!(u64,
                program_clock_reference_base: 33 => 0,
                reserved: 6 => 0b111111,
                program_clock_reference_extension: 9 => 0,
            )[0 .. 7],
        );

        let packet = TsPacketRef::from(&data);
        let adaptation_field = packet.adaptation_field().unwrap();
        assert_eq!(adaptation_field.pcr(), Some(0));
    }

    // Set PCR bytes to max and check PCR value again
    {
        let mut data = data.clone();
        data[6 .. 13].copy_from_slice(
            &pack_bits!(u64,
                program_clock_reference_base: 33 => 0x1_FFFF_FFFF,
                reserved: 6 => 0b111111,
                program_clock_reference_extension: 9 => 299, // pcr extension max value is 299 (27MHz / 90kHz - 1)
            )[0 .. 7],
        );

        let packet = TsPacketRef::from(&data);
        let adaptation_field = packet.adaptation_field().unwrap();
        assert_eq!(adaptation_field.pcr(), Some(ts::PCR_MAX));
    }

    // Set PCR bytes to max with overflow and check PCR value again
    {
        let mut data = data.clone();
        data[6 .. 13].copy_from_slice(
            &pack_bits!(u64,
                program_clock_reference_base: 33 => 0x1_FFFF_FFFF,
                reserved: 6 => 0b111111,
                program_clock_reference_extension: 9 => 0x1FF,
            )[0 .. 7],
        );

        let packet = TsPacketRef::from(&data);
        let adaptation_field = packet.adaptation_field().unwrap();
        assert_eq!(adaptation_field.pcr(), Some(ts::PCR_MAX));
    }
}

#[test]
fn test_set_adaptation_field() {
    let mut data: Vec<u8> = vec![0x47, 0x00, 0x00, 0x00];
    data.resize(ts::PACKET_SIZE, 0xAA);

    let mut packet = TsPacketMut::try_from(data.as_mut_slice()).unwrap();

    packet.set_adaptation_field(1);
    let ts_ref = TsPacketRef::from(packet.as_ref());
    assert!(
        ts_ref.adaptation_field().is_some(),
        "adaptation field should exist"
    );
    let data = packet.as_ref();
    assert_eq!(data[4], 0, "af length should be 0");
    assert_eq!(data[5], 0xAA, "payload should be unchanged");

    packet.set_adaptation_field(0);
    let ts_ref = TsPacketRef::from(packet.as_ref());
    assert!(
        ts_ref.adaptation_field().is_none(),
        "adaptation field should not exist"
    );

    packet.set_adaptation_field(2);
    let ts_ref = TsPacketRef::from(packet.as_ref());
    assert!(
        ts_ref.adaptation_field().is_some(),
        "adaptation field should exist"
    );
    let data = ts_ref.as_ref();
    assert_eq!(data[4], 1, "af length should be 1");
    assert_eq!(data[5], 0x00, "af flags should be 0x00");
    assert_eq!(data[6], 0xAA, "payload should be unchanged");

    packet.set_adaptation_field(3);
    let ts_ref = TsPacketRef::from(packet.as_ref());
    assert!(
        ts_ref.adaptation_field().is_some(),
        "adaptation field should exist"
    );
    let data = ts_ref.as_ref();
    assert_eq!(data[4], 2, "af length should be 2");
    assert_eq!(data[5], 0x00, "af flags should be 0x00");
    assert_eq!(data[6], 0xFF, "af stuffing byte should be 0xFF");
    assert_eq!(ts_ref.as_ref()[7], 0xAA, "payload should be unchanged");

    packet.set_adaptation_field(184);
    let ts_ref = TsPacketRef::from(packet.as_ref());
    assert!(
        ts_ref.adaptation_field().is_some(),
        "adaptation field should exist"
    );
    let data = ts_ref.as_ref();
    assert_eq!(data[4], 183, "af length should be 183");
    assert_eq!(data[5], 0x00, "af flags should be 0x00");
    for i in 6 .. 188 {
        assert_eq!(data[i], 0xFF, "af stuffing byte should be 0xFF");
    }
}

#[test]
fn test_set_pcr() {
    let mut data: Vec<u8> = vec![0x47, 0x01, 0x00, 0x00];
    data.resize(ts::PACKET_SIZE, 0x00);

    let mut packet = TsPacketMut::try_from(data.as_mut_slice()).unwrap();
    packet.set_adaptation_field(184);

    packet.set_pcr(86405647);
    assert_eq!(
        &[0x00, 0x02, 0x32, 0x89, 0x7E, 0xF7],
        &packet.as_ref()[6 .. 12]
    );

    packet.set_pcr(ts::PCR_MAX);
    assert_eq!(
        &[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2B],
        &packet.as_ref()[6 .. 12]
    );

    packet.set_pcr(0);
    assert_eq!(
        &[0x00, 0x00, 0x00, 0x00, 0x7E, 0x00],
        &packet.as_ref()[6 .. 12]
    );
}