ffmpeg-the-third 5.0.0+ffmpeg-8.1

Safe FFmpeg wrapper (FFmpeg 5+ compatible fork of the ffmpeg crate)
Documentation
use crate::ffi::*;
use crate::utils;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};

#[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Space {
    RGB,
    BT709,
    Unspecified,
    Reserved,
    FCC,
    BT470BG,
    SMPTE170M,
    SMPTE240M,
    YCGCO,
    BT2020NCL,
    BT2020CL,
    SMPTE2085,

    ChromaDerivedNCL,
    ChromaDerivedCL,
    ICTCP,

    #[cfg(feature = "ffmpeg_7_1")]
    IPTC2,
    #[cfg(feature = "ffmpeg_7_1")]
    YCGCORE,
    #[cfg(feature = "ffmpeg_7_1")]
    YCGCORO,
}

impl Space {
    pub const YCOCG: Space = Space::YCGCO;

    pub fn name(&self) -> Option<&'static str> {
        if *self == Space::Unspecified {
            return None;
        }
        unsafe {
            let ptr = av_color_space_name((*self).into());
            utils::optional_str_from_c_ptr(ptr)
        }
    }
}

impl From<AVColorSpace> for Space {
    fn from(value: AVColorSpace) -> Self {
        use AVColorSpace as AV;

        match value {
            AV::RGB => Space::RGB,
            AV::BT709 => Space::BT709,
            AV::UNSPECIFIED => Space::Unspecified,
            AV::RESERVED => Space::Reserved,
            AV::FCC => Space::FCC,
            AV::BT470BG => Space::BT470BG,
            AV::SMPTE170M => Space::SMPTE170M,
            AV::SMPTE240M => Space::SMPTE240M,
            AV::YCGCO => Space::YCGCO,
            AV::BT2020_NCL => Space::BT2020NCL,
            AV::BT2020_CL => Space::BT2020CL,
            AV::SMPTE2085 => Space::SMPTE2085,
            AV::NB => Space::Unspecified,

            AV::CHROMA_DERIVED_NCL => Space::ChromaDerivedNCL,
            AV::CHROMA_DERIVED_CL => Space::ChromaDerivedCL,
            AV::ICTCP => Space::ICTCP,

            #[cfg(feature = "ffmpeg_7_1")]
            AV::IPT_C2 => Space::IPTC2,
            #[cfg(feature = "ffmpeg_7_1")]
            AV::YCGCO_RE => Space::YCGCORE,
            #[cfg(feature = "ffmpeg_7_1")]
            AV::YCGCO_RO => Space::YCGCORO,

            _ => unimplemented!(),
        }
    }
}

impl From<Space> for AVColorSpace {
    fn from(value: Space) -> AVColorSpace {
        use AVColorSpace as AV;

        match value {
            Space::RGB => AV::RGB,
            Space::BT709 => AV::BT709,
            Space::Unspecified => AV::UNSPECIFIED,
            Space::Reserved => AV::RESERVED,
            Space::FCC => AV::FCC,
            Space::BT470BG => AV::BT470BG,
            Space::SMPTE170M => AV::SMPTE170M,
            Space::SMPTE240M => AV::SMPTE240M,
            Space::YCGCO => AV::YCGCO,
            Space::BT2020NCL => AV::BT2020_NCL,
            Space::BT2020CL => AV::BT2020_CL,
            Space::SMPTE2085 => AV::SMPTE2085,

            Space::ChromaDerivedNCL => AV::CHROMA_DERIVED_NCL,
            Space::ChromaDerivedCL => AV::CHROMA_DERIVED_CL,
            Space::ICTCP => AV::ICTCP,

            #[cfg(feature = "ffmpeg_7_1")]
            Space::IPTC2 => AV::IPT_C2,
            #[cfg(feature = "ffmpeg_7_1")]
            Space::YCGCORE => AV::YCGCO_RE,
            #[cfg(feature = "ffmpeg_7_1")]
            Space::YCGCORO => AV::YCGCO_RO,
        }
    }
}