ebml_webm/error.rs
1//! EBML / `WebM` parse error (`thiserror`).
2
3#![forbid(unsafe_code)]
4
5use thiserror::Error;
6
7/// Low-level EBML/`WebM` parse error.
8///
9/// Used by the public low-level parse functions in [`crate::vint`]. The
10/// stateful [`crate::Demuxer`] has no `Result`-returning `push_bytes` /
11/// `poll_frame` (mirrors `iso_bmff::Demuxer`) — it handles malformed or
12/// unsupported bytes internally by dropping data cleanly, never panicking.
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
14#[non_exhaustive]
15pub enum Error {
16 /// Buffer does not yet contain a full VINT / element header — wait for
17 /// more bytes (not a malformed-data error).
18 #[error("truncated EBML VINT or element header (need more bytes)")]
19 Incomplete,
20 /// The VINT length marker was not found within 8 bytes (reserved /
21 /// invalid encoding). Unrecoverable at this buffer position.
22 #[error("EBML VINT length marker not found within 8 bytes (reserved encoding)")]
23 ReservedVint,
24 /// A recognized but unimplemented EBML/`WebM` feature (e.g. `SimpleBlock`
25 /// lacing, an over-long element ID). Named per call site.
26 #[error("EBML/WebM feature not supported by this demuxer: {0}")]
27 Unsupported(&'static str),
28}
29
30/// [`crate::mux::Muxer`] error.
31///
32/// Kept separate from [`Error`] (the low-level *parse*-error type) because
33/// the two error sets are disjoint: nothing in `mux` ever returns [`Error`],
34/// and nothing in `vint`/`demux` ever returns this type. Merging them would
35/// force every exhaustive `match` on [`Error`] in the demux path to account
36/// for mux-only variants it can never produce.
37#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
38#[non_exhaustive]
39pub enum MuxError {
40 /// [`crate::mux::Muxer::add_track`]: `TrackNumber` `0` is reserved
41 /// (Matroska/`WebM` forbid it as a real track number).
42 #[error("WebM TrackNumber must be non-zero")]
43 InvalidTrackNumber,
44 /// [`crate::mux::Muxer::add_track`]: a track with this `TrackNumber` was
45 /// already registered.
46 #[error("duplicate WebM TrackNumber {0}")]
47 DuplicateTrack(u64),
48 /// [`crate::mux::Muxer::push_frame`]: `track_number` was never registered
49 /// via `add_track`.
50 #[error("push_frame references unregistered TrackNumber {0}")]
51 UnknownTrack(u64),
52}