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 /// The pack header carries the ISO/IEC 11172-1 (MPEG-1) `'0010'` pack
44 /// prefix, a different (12-byte, no SCR extension) layout this crate
45 /// does not parse โ distinct from [`Self::BadScrPrefix`], which means
46 /// the bytes are neither a valid MPEG-1 nor MPEG-2 pack header (#1119).
47 #[error(
48 "MPEG-1 (ISO/IEC 11172-1) pack header is not supported (only ISO/IEC 13818-1 MPEG-2 packs are)"
49 )]
50 Mpeg1NotSupported,
51 /// `system_header` `stream_id == 0xB7` but the extension form prefix is wrong.
52 #[error("bad stream_id_extension prefix byte: {0:#04X}")]
53 BadStreamIdExtensionPrefix(u8),
54 /// `program_mux_rate` is 0 (forbidden).
55 #[error("program_mux_rate is 0 (forbidden)")]
56 ZeroMuxRate,
57 /// `pack_stuffing_length` exceeds 7 (3-bit field).
58 #[error("pack_stuffing_length {0} exceeds maximum 7")]
59 StuffingLengthTooLarge(u8),
60 /// `PackHeader::stuffing.len()` does not match `stuffing_length` โ the
61 /// two are independently-settable public fields (#1119 W8).
62 #[error("pack_header stuffing_length ({declared}) does not match stuffing.len() ({actual})")]
63 StuffingLengthMismatch {
64 /// The `stuffing_length` field value.
65 declared: u8,
66 /// The actual `stuffing.len()`.
67 actual: usize,
68 },
69 /// A caller-set field holds a value that would not read back as the same
70 /// header (serialize -> parse must be the identity, ISO/IEC 13818-1
71 /// Table 2-40 `nextbits() == '1'` stream-loop condition).
72 #[error("invalid {field}: {reason}")]
73 InvalidField {
74 /// The offending field.
75 field: &'static str,
76 /// Why the value cannot be serialized.
77 reason: &'static str,
78 },
79 /// `header_length` overflows the available buffer.
80 #[error("header_length {header_length} exceeds available bytes ({available})")]
81 HeaderLengthOverflow {
82 /// The header_length value.
83 header_length: usize,
84 /// Bytes available after the header_length field.
85 available: usize,
86 },
87 /// `program_stream_map_length` overflows the available buffer.
88 #[error("program_stream_map_length {map_length} exceeds available bytes ({available})")]
89 MapLengthOverflow {
90 /// The program_stream_map_length value.
91 map_length: usize,
92 /// Bytes available after the length field.
93 available: usize,
94 },
95 /// PES packet parse error from `mpeg-pes`.
96 #[error("PES parse error: {0}")]
97 Pes(#[from] mpeg_pes::Error),
98
99 /// A length or count field's value does not fit its wire field
100 /// (see `broadcast_common::len`, #1129).
101 #[error(transparent)]
102 FieldOverflow(#[from] broadcast_common::len::FieldOverflow),
103}