Skip to main content

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}