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(transparent)]
12    BufferTooShort(#[from] broadcast_common::error::BufferTooShort),
13    /// Output buffer passed to `serialize_into` was smaller than
14    /// `serialized_len()`.
15    #[error(transparent)]
16    OutputBufferTooSmall(#[from] broadcast_common::error::OutputBufferTooSmall),
17    /// `pack_start_code` was not `0x000001BA`.
18    #[error("invalid pack_start_code: {0:#010X} (expected 0x000001BA)")]
19    BadPackStartCode(u32),
20    /// `system_header_start_code` was not `0x000001BB`.
21    #[error("invalid system_header_start_code: {0:#010X} (expected 0x000001BB)")]
22    BadSystemHeaderStartCode(u32),
23    /// `map_stream_id` was not `0xBC`.
24    #[error("invalid map_stream_id: {0:#04X} (expected 0xBC)")]
25    BadMapStreamId(u8),
26    /// Invalid PSM CRC_32.
27    #[error(transparent)]
28    CrcMismatch(#[from] broadcast_common::error::CrcMismatch),
29    /// A required `marker_bit` was not `1`.
30    #[error("bad marker bit in {0}")]
31    BadMarker(&'static str),
32    /// The `01` prefix after `pack_start_code` was not `01`.
33    #[error("bad SCR prefix: {0:#04b} (expected 0b01)")]
34    BadScrPrefix(u8),
35    /// The pack header carries the ISO/IEC 11172-1 (MPEG-1) `'0010'` pack
36    /// prefix, a different (12-byte, no SCR extension) layout this crate
37    /// does not parse โ€” distinct from [`Self::BadScrPrefix`], which means
38    /// the bytes are neither a valid MPEG-1 nor MPEG-2 pack header (#1119).
39    #[error(
40        "MPEG-1 (ISO/IEC 11172-1) pack header is not supported (only ISO/IEC 13818-1 MPEG-2 packs are)"
41    )]
42    Mpeg1NotSupported,
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    /// `PackHeader::stuffing.len()` does not match `stuffing_length` โ€” the
53    /// two are independently-settable public fields (#1119 W8).
54    #[error("pack_header stuffing_length ({declared}) does not match stuffing.len() ({actual})")]
55    StuffingLengthMismatch {
56        /// The `stuffing_length` field value.
57        declared: u8,
58        /// The actual `stuffing.len()`.
59        actual: usize,
60    },
61    /// A caller-set field holds a value that would not read back as the same
62    /// header (serialize -> parse must be the identity, ISO/IEC 13818-1
63    /// Table 2-40 `nextbits() == '1'` stream-loop condition).
64    #[error(transparent)]
65    InvalidField(#[from] broadcast_common::error::InvalidField),
66    /// `header_length` overflows the available buffer.
67    #[error("header_length {header_length} exceeds available bytes ({available})")]
68    HeaderLengthOverflow {
69        /// The header_length value.
70        header_length: usize,
71        /// Bytes available after the header_length field.
72        available: usize,
73    },
74    /// `program_stream_map_length` overflows the available buffer.
75    #[error("program_stream_map_length {map_length} exceeds available bytes ({available})")]
76    MapLengthOverflow {
77        /// The program_stream_map_length value.
78        map_length: usize,
79        /// Bytes available after the length field.
80        available: usize,
81    },
82    /// PES packet parse error from `mpeg-pes`.
83    #[error("PES parse error: {0}")]
84    Pes(#[from] mpeg_pes::Error),
85
86    /// A length or count field's value does not fit its wire field
87    /// (see `broadcast_common::len`, #1129).
88    #[error(transparent)]
89    FieldOverflow(#[from] broadcast_common::len::FieldOverflow),
90}