use crate::error::{Result, Ret, RsmpegError};
use libc::c_int;
use rusty_ffmpeg::ffi;
use std::{ops::Deref, ptr::NonNull};
pub trait PointerUpgrade<T>: Sized {
fn upgrade(self) -> Option<NonNull<T>>;
}
impl<T> PointerUpgrade<T> for *const T {
#[inline]
fn upgrade(self) -> Option<NonNull<T>> {
NonNull::new(self as *mut _)
}
}
impl<T> PointerUpgrade<T> for *mut T {
#[inline]
fn upgrade(self) -> Option<NonNull<T>> {
NonNull::new(self)
}
}
pub trait RsmpegPointerUpgrade<T>: PointerUpgrade<T> {
fn upgrade_or(self, err: c_int) -> Result<NonNull<T>>;
}
impl<T> RsmpegPointerUpgrade<T> for *const T {
#[inline]
fn upgrade_or(self, err: c_int) -> Result<NonNull<T>> {
self.upgrade().ok_or(RsmpegError::AVError(err))
}
}
impl<T> RsmpegPointerUpgrade<T> for *mut T {
#[inline]
fn upgrade_or(self, err: c_int) -> Result<NonNull<T>> {
self.upgrade().ok_or(RsmpegError::AVError(err))
}
}
pub trait RetUpgrade {
fn upgrade(self) -> Ret;
}
impl RetUpgrade for c_int {
fn upgrade(self) -> Ret {
if self < 0 {
Ret::Err(self)
} else {
Ret::Ok(self)
}
}
}
pub trait UnsafeDerefMut: Deref {
unsafe fn deref_mut(&mut self) -> &mut Self::Target;
}
pub const AVERROR_EAGAIN: i32 = ffi::AVERROR(ffi::EAGAIN);
pub const AVERROR_ENOMEM: i32 = ffi::AVERROR(ffi::ENOMEM);