#[derive(Clone, Debug)]
pub struct HwDeviceInfo {
pub name: String,
pub driver_version: Option<String>,
pub api_version: Option<String>,
pub total_memory_bytes: Option<u64>,
pub extra: Vec<(String, String)>,
pub codecs: Vec<HwCodecCaps>,
}
#[derive(Clone, Debug)]
pub struct HwCodecCaps {
pub codec: String,
pub decode: bool,
pub encode: bool,
pub max_width: Option<u32>,
pub max_height: Option<u32>,
pub max_bit_depth: Option<u32>,
pub profiles: Vec<String>,
pub extra: Vec<(String, String)>,
}
pub type EngineProbeFn = fn() -> Vec<HwDeviceInfo>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn hw_device_info_clone_and_extras_round_trip() {
let info = HwDeviceInfo {
name: "Test GPU".into(),
driver_version: Some("1.0".into()),
api_version: Some("API 1".into()),
total_memory_bytes: Some(16 * 1024 * 1024 * 1024),
extra: vec![("compute_capability".into(), "12.0".into())],
codecs: vec![HwCodecCaps {
codec: "h264".into(),
decode: true,
encode: true,
max_width: Some(8192),
max_height: Some(8192),
max_bit_depth: Some(8),
profiles: vec!["Baseline".into(), "Main".into(), "High".into()],
extra: vec![],
}],
};
let clone = info.clone();
assert_eq!(clone.name, "Test GPU");
assert_eq!(clone.driver_version.as_deref(), Some("1.0"));
assert_eq!(clone.api_version.as_deref(), Some("API 1"));
assert_eq!(clone.total_memory_bytes, Some(16 * 1024 * 1024 * 1024));
assert_eq!(clone.extra.len(), 1);
assert_eq!(clone.extra[0].0, "compute_capability");
assert_eq!(clone.extra[0].1, "12.0");
assert_eq!(clone.codecs.len(), 1);
assert_eq!(clone.codecs[0].codec, "h264");
assert!(clone.codecs[0].decode);
assert!(clone.codecs[0].encode);
assert_eq!(clone.codecs[0].profiles.len(), 3);
}
#[test]
fn engine_probe_fn_is_callable() {
fn empty_probe() -> Vec<HwDeviceInfo> {
vec![]
}
let probe: EngineProbeFn = empty_probe;
assert!(probe().is_empty());
}
}