Skip to main content

video_rs/
error.rs

1extern crate ffmpeg_next as ffmpeg;
2
3use ffmpeg::Error as FfmpegError;
4
5/// Represents video I/O Errors. Some errors are generated by the ffmpeg backend, and are wrapped in
6/// `BackendError`.
7#[derive(Debug, Clone)]
8pub enum Error {
9    ReadExhausted,
10    DecodeExhausted,
11    WriteRetryLimitReached,
12    InvalidFrameFormat,
13    InvalidExtraData,
14    MissingCodecParameters,
15    UnsupportedCodecParameterSets,
16    InvalidResizeParameters,
17    UninitializedCodec,
18    UnsupportedCodecHardwareAccelerationDeviceType,
19    BackendError(FfmpegError),
20}
21
22impl std::error::Error for Error {
23    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
24        match *self {
25            Error::ReadExhausted => None,
26            Error::DecodeExhausted => None,
27            Error::WriteRetryLimitReached => None,
28            Error::InvalidFrameFormat => None,
29            Error::InvalidExtraData => None,
30            Error::MissingCodecParameters => None,
31            Error::UnsupportedCodecParameterSets => None,
32            Error::InvalidResizeParameters => None,
33            Error::UninitializedCodec => None,
34            Error::UnsupportedCodecHardwareAccelerationDeviceType => None,
35            Error::BackendError(ref internal) => Some(internal),
36        }
37    }
38}
39
40impl std::fmt::Display for Error {
41    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
42        match *self {
43            Error::ReadExhausted => write!(f, "stream exhausted"),
44            Error::DecodeExhausted => write!(f, "stream exhausted"),
45            Error::WriteRetryLimitReached => {
46                write!(f, "cannot write to video stream, even after multiple tries")
47            }
48            Error::InvalidFrameFormat => write!(
49                f,
50                "provided frame does not match expected dimensions and/or pixel format"
51            ),
52            Error::InvalidExtraData => write!(f, "codec parameters extradata is corrupted"),
53            Error::MissingCodecParameters => write!(f, "codec parameters missing"),
54            Error::UnsupportedCodecParameterSets => write!(
55                f,
56                "extracting parameter sets for this codec is not suppored"
57            ),
58            Error::InvalidResizeParameters => {
59                write!(f, "cannot resize frame into provided dimensions")
60            }
61            Error::UninitializedCodec => {
62                write!(f, "codec context is not initialized properly")
63            }
64            Error::UnsupportedCodecHardwareAccelerationDeviceType => {
65                write!(f, "codec does not supported hardware acceleration device")
66            }
67            Error::BackendError(ref internal) => internal.fmt(f),
68        }
69    }
70}
71
72impl From<FfmpegError> for Error {
73    fn from(internal: FfmpegError) -> Error {
74        Error::BackendError(internal)
75    }
76}