extern crate ffmpeg_next as ffmpeg;
use ffmpeg::Error as FfmpegError;
#[derive(Debug, Clone)]
pub enum Error {
ReadExhausted,
DecodeExhausted,
WriteRetryLimitReached,
InvalidFrameFormat,
InvalidExtraData,
MissingCodecParameters,
UnsupportedCodecParameterSets,
InvalidResizeParameters,
UninitializedCodec,
UnsupportedCodecHardwareAccelerationDeviceType,
BackendError(FfmpegError),
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match *self {
Error::ReadExhausted => None,
Error::DecodeExhausted => None,
Error::WriteRetryLimitReached => None,
Error::InvalidFrameFormat => None,
Error::InvalidExtraData => None,
Error::MissingCodecParameters => None,
Error::UnsupportedCodecParameterSets => None,
Error::InvalidResizeParameters => None,
Error::UninitializedCodec => None,
Error::UnsupportedCodecHardwareAccelerationDeviceType => None,
Error::BackendError(ref internal) => Some(internal),
}
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match *self {
Error::ReadExhausted => write!(f, "stream exhausted"),
Error::DecodeExhausted => write!(f, "stream exhausted"),
Error::WriteRetryLimitReached => {
write!(f, "cannot write to video stream, even after multiple tries")
}
Error::InvalidFrameFormat => write!(
f,
"provided frame does not match expected dimensions and/or pixel format"
),
Error::InvalidExtraData => write!(f, "codec parameters extradata is corrupted"),
Error::MissingCodecParameters => write!(f, "codec parameters missing"),
Error::UnsupportedCodecParameterSets => write!(
f,
"extracting parameter sets for this codec is not suppored"
),
Error::InvalidResizeParameters => {
write!(f, "cannot resize frame into provided dimensions")
}
Error::UninitializedCodec => {
write!(f, "codec context is not initialized properly")
}
Error::UnsupportedCodecHardwareAccelerationDeviceType => {
write!(f, "codec does not supported hardware acceleration device")
}
Error::BackendError(ref internal) => internal.fmt(f),
}
}
}
impl From<FfmpegError> for Error {
fn from(internal: FfmpegError) -> Error {
Error::BackendError(internal)
}
}