use crate::{Error, Result};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct StreamId(u8);
impl StreamId {
pub const PROGRAM_STREAM_MAP: u8 = 0xBC;
pub const PRIVATE_STREAM_1: u8 = 0xBD;
pub const PADDING_STREAM: u8 = 0xBE;
pub const PRIVATE_STREAM_2: u8 = 0xBF;
pub const AUDIO_MIN: u8 = 0xC0;
pub const AUDIO_MAX: u8 = 0xDF;
pub const VIDEO_MIN: u8 = 0xE0;
pub const VIDEO_MAX: u8 = 0xEF;
pub const ECM_STREAM: u8 = 0xF0;
pub const EMM_STREAM: u8 = 0xF1;
pub const DSM_CC: u8 = 0xF2;
pub const ISO_13522_STREAM: u8 = 0xF3;
pub const H222_1_TYPE_A: u8 = 0xF4;
pub const H222_1_TYPE_B: u8 = 0xF5;
pub const H222_1_TYPE_C: u8 = 0xF6;
pub const H222_1_TYPE_D: u8 = 0xF7;
pub const H222_1_TYPE_E: u8 = 0xF8;
pub const ANCILLARY_STREAM: u8 = 0xF9;
pub const SL_PACKETIZED_STREAM: u8 = 0xFA;
pub const FLEX_MUX_STREAM: u8 = 0xFB;
pub const METADATA_STREAM: u8 = 0xFC;
pub const EXTENDED_STREAM_ID: u8 = 0xFD;
pub const RESERVED_DATA_STREAM: u8 = 0xFE;
pub const PROGRAM_STREAM_DIRECTORY: u8 = 0xFF;
pub fn new(id: u8) -> Self {
StreamId(id)
}
pub fn new_audio(id: u8) -> Result<Self> {
if !((Self::AUDIO_MIN..=Self::AUDIO_MAX).contains(&id)) {
return Err(Error::invalid_input(format!("Not an audio ID: {}", id)));
}
Ok(StreamId(id))
}
pub fn new_video(id: u8) -> Result<Self> {
if !((Self::VIDEO_MIN..=Self::VIDEO_MAX).contains(&id)) {
return Err(Error::invalid_input(format!("Not a video ID: {}", id)));
}
Ok(StreamId(id))
}
pub fn as_u8(&self) -> u8 {
self.0
}
pub fn is_audio(&self) -> bool {
0xC0 <= self.0 && self.0 <= 0xDF
}
pub fn is_video(&self) -> bool {
0xE0 <= self.0 && self.0 <= 0xEF
}
}