mpeg2ts 0.3.1

MPEG2-TS decoding/encoding library
Documentation
use crate::crc::Crc32;
use crate::ts::TsPacket;
use crate::{ErrorKind, Result};
use std::io::{self, Read, Write};

pub fn consume_stuffing_bytes<R: Read>(mut reader: R) -> Result<()> {
    let mut buf = [0];
    while 1 == track_io!(reader.read(&mut buf))? {
        track_assert_eq!(buf[0], 0xFF, ErrorKind::InvalidInput);
    }
    Ok(())
}

pub fn write_stuffing_bytes<W: Write>(mut writer: W, size: usize) -> Result<()> {
    let buf = [0xFF; TsPacket::SIZE];
    track_io!(writer.write_all(&buf[..size]))?;
    Ok(())
}

#[derive(Debug)]
pub struct WithCrc32<T> {
    stream: T,
    crc32: Crc32,
}
impl<T> WithCrc32<T> {
    pub fn new(stream: T) -> Self {
        WithCrc32 {
            stream,
            crc32: Crc32::new(),
        }
    }
    pub fn crc32(&self) -> u32 {
        self.crc32.value()
    }
}
impl<T: Read> Read for WithCrc32<T> {
    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
        let size = self.stream.read(buf)?;
        self.crc32.update(&buf[..size]);
        Ok(size)
    }
}
impl<T: Write> Write for WithCrc32<T> {
    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
        let size = self.stream.write(buf)?;
        self.crc32.update(&buf[..size]);
        Ok(size)
    }
    fn flush(&mut self) -> io::Result<()> {
        self.stream.flush()
    }
}