libde265 0.2.0

Low-level bindings for libdeH265.
Documentation
use std::ffi::CStr;

use libde265_sys::de265_error;

#[derive(Clone, Copy, Debug, thiserror::Error)]
pub enum Error {
    #[error("no such file")]
    NoSuchFile,

    #[error("checksum mismatch")]
    ChecksumMismatch,

    #[error("ctb outside image area")]
    CtbOutsideImageArea,

    #[error("out of memory")]
    OutOfMemory,

    #[error("coded parameter out of range")]
    CodedParameterOutOfRange,

    #[error("image buffer full")]
    ImageBufferFull,

    #[error("cannot start threadpool")]
    CannotStartThreadpool,

    #[error("Library Initialization Failed")]
    LibraryInitializationFailed,

    #[error("coefficient out of image bounds")]
    CoefficientOutOfImageBounds,

    #[error("library not initialized")]
    LibraryNotInitialized,

    #[error("waiting for input data")]
    WaitingForInputData,

    #[error("cannot process sei")]
    CannotProcessSei,

    #[error("parameter parsing")]
    ParameterParsing,

    #[error("noinitial slice header")]
    NoInitialSliceHeader,

    #[error("premature end of slice")]
    PrematureEndOfSlice,

    #[error("unspecified decoding error")]
    UnspecifiedDecodingError,

    #[error("not yet implemented")]
    NotImplementedYet,

    #[error("unknown error {0}")]
    UnknownError(u32),
}

impl Error {
    pub fn from_res(kind: de265_error::Type) -> Result<(), Self> {
        match kind {
            de265_error::DE265_OK => Ok(()),
            de265_error::DE265_ERROR_NO_SUCH_FILE => Err(Error::NoSuchFile),
            de265_error::DE265_ERROR_COEFFICIENT_OUT_OF_IMAGE_BOUNDS => {
                Err(Error::CoefficientOutOfImageBounds)
            }
            de265_error::DE265_ERROR_CHECKSUM_MISMATCH => Err(Error::ChecksumMismatch),
            de265_error::DE265_ERROR_CTB_OUTSIDE_IMAGE_AREA => Err(Error::CtbOutsideImageArea),
            de265_error::DE265_ERROR_OUT_OF_MEMORY => Err(Error::OutOfMemory),
            de265_error::DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE => {
                Err(Error::CodedParameterOutOfRange)
            }
            de265_error::DE265_ERROR_IMAGE_BUFFER_FULL => Err(Error::ImageBufferFull),
            de265_error::DE265_ERROR_CANNOT_START_THREADPOOL => Err(Error::CannotStartThreadpool),
            de265_error::DE265_ERROR_LIBRARY_INITIALIZATION_FAILED => {
                Err(Error::LibraryInitializationFailed)
            }
            de265_error::DE265_ERROR_LIBRARY_NOT_INITIALIZED => Err(Error::LibraryNotInitialized),
            de265_error::DE265_ERROR_WAITING_FOR_INPUT_DATA => Err(Error::WaitingForInputData),
            de265_error::DE265_ERROR_CANNOT_PROCESS_SEI => Err(Error::CannotProcessSei),
            de265_error::DE265_ERROR_PARAMETER_PARSING => Err(Error::ParameterParsing),
            de265_error::DE265_ERROR_NO_INITIAL_SLICE_HEADER => Err(Error::NoInitialSliceHeader),
            de265_error::DE265_ERROR_PREMATURE_END_OF_SLICE => Err(Error::PrematureEndOfSlice),
            de265_error::DE265_ERROR_UNSPECIFIED_DECODING_ERROR => {
                Err(Error::UnspecifiedDecodingError)
            }
            de265_error::DE265_ERROR_NOT_IMPLEMENTED_YET => Err(Error::NotImplementedYet),

            warning @ 1000.. => {
                let msg = unsafe { CStr::from_ptr(libde265_sys::de265_get_error_text(warning)) };
                log::warn!("{}", msg.to_string_lossy());
                Ok(())
            }
            code => Err(Self::UnknownError(code)),
        }
    }
}