Skip to main content

mpeg_ps/
error.rs

1//! Error type for MPEG Program Stream parsing.
2
3/// Result alias for Program Stream parsing.
4pub type Result<T> = core::result::Result<T, Error>;
5
6/// A Program Stream parse error.
7#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
8#[non_exhaustive]
9pub enum Error {
10    /// Input shorter than required.
11    #[error("buffer too short: need {need}, have {have} ({what})")]
12    BufferTooShort {
13        /// Bytes required.
14        need: usize,
15        /// Bytes available.
16        have: usize,
17        /// What was being parsed.
18        what: &'static str,
19    },
20    /// `pack_start_code` was not `0x000001BA`.
21    #[error("invalid pack_start_code: {0:#010X} (expected 0x000001BA)")]
22    BadPackStartCode(u32),
23    /// `system_header_start_code` was not `0x000001BB`.
24    #[error("invalid system_header_start_code: {0:#010X} (expected 0x000001BB)")]
25    BadSystemHeaderStartCode(u32),
26    /// `map_stream_id` was not `0xBC`.
27    #[error("invalid map_stream_id: {0:#04X} (expected 0xBC)")]
28    BadMapStreamId(u8),
29    /// Invalid PSM CRC_32.
30    #[error("PSM CRC_32 mismatch: computed {computed:#010X}, stored {stored:#010X}")]
31    BadCrc {
32        /// CRC computed over the PSM bytes.
33        computed: u32,
34        /// CRC stored in the PSM trailer.
35        stored: u32,
36    },
37    /// A required `marker_bit` was not `1`.
38    #[error("bad marker bit in {0}")]
39    BadMarker(&'static str),
40    /// The `01` prefix after `pack_start_code` was not `01`.
41    #[error("bad SCR prefix: {0:#04b} (expected 0b01)")]
42    BadScrPrefix(u8),
43    /// `system_header` `stream_id == 0xB7` but the extension form prefix is wrong.
44    #[error("bad stream_id_extension prefix byte: {0:#04X}")]
45    BadStreamIdExtensionPrefix(u8),
46    /// `program_mux_rate` is 0 (forbidden).
47    #[error("program_mux_rate is 0 (forbidden)")]
48    ZeroMuxRate,
49    /// `pack_stuffing_length` exceeds 7 (3-bit field).
50    #[error("pack_stuffing_length {0} exceeds maximum 7")]
51    StuffingLengthTooLarge(u8),
52    /// `header_length` overflows the available buffer.
53    #[error("header_length {header_length} exceeds available bytes ({available})")]
54    HeaderLengthOverflow {
55        /// The header_length value.
56        header_length: usize,
57        /// Bytes available after the header_length field.
58        available: usize,
59    },
60    /// `program_stream_map_length` overflows the available buffer.
61    #[error("program_stream_map_length {map_length} exceeds available bytes ({available})")]
62    MapLengthOverflow {
63        /// The program_stream_map_length value.
64        map_length: usize,
65        /// Bytes available after the length field.
66        available: usize,
67    },
68    /// PES packet parse error from `dvb-pes`.
69    #[error("PES parse error: {0}")]
70    Pes(#[from] dvb_pes::Error),
71}