#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum HardwareAccel {
#[default]
Auto,
None,
Nvdec,
Qsv,
Amf,
VideoToolbox,
Vaapi,
}
impl HardwareAccel {
#[must_use]
pub const fn is_specific(&self) -> bool {
!matches!(self, Self::Auto | Self::None)
}
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
Self::Auto => "auto",
Self::None => "none",
Self::Nvdec => "nvdec",
Self::Qsv => "qsv",
Self::Amf => "amf",
Self::VideoToolbox => "videotoolbox",
Self::Vaapi => "vaapi",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn hardware_accel_default_should_be_auto() {
let accel = HardwareAccel::default();
assert_eq!(accel, HardwareAccel::Auto);
}
#[test]
fn hardware_accel_is_specific_should_return_false_for_auto_and_none() {
assert!(!HardwareAccel::Auto.is_specific());
assert!(!HardwareAccel::None.is_specific());
}
#[test]
fn hardware_accel_is_specific_should_return_true_for_explicit_accelerators() {
assert!(HardwareAccel::Nvdec.is_specific());
assert!(HardwareAccel::Qsv.is_specific());
assert!(HardwareAccel::Amf.is_specific());
assert!(HardwareAccel::VideoToolbox.is_specific());
assert!(HardwareAccel::Vaapi.is_specific());
}
#[test]
fn hardware_accel_name_should_return_correct_strings() {
assert_eq!(HardwareAccel::Auto.name(), "auto");
assert_eq!(HardwareAccel::None.name(), "none");
assert_eq!(HardwareAccel::Nvdec.name(), "nvdec");
assert_eq!(HardwareAccel::Qsv.name(), "qsv");
assert_eq!(HardwareAccel::Amf.name(), "amf");
assert_eq!(HardwareAccel::VideoToolbox.name(), "videotoolbox");
assert_eq!(HardwareAccel::Vaapi.name(), "vaapi");
}
#[test]
fn hardware_accel_variants_should_be_accessible() {
let accels = [
HardwareAccel::Auto,
HardwareAccel::None,
HardwareAccel::Nvdec,
HardwareAccel::Qsv,
HardwareAccel::Amf,
HardwareAccel::VideoToolbox,
HardwareAccel::Vaapi,
];
for accel in accels {
let _ = format!("{accel:?}");
}
}
}