/// 将 PipeWire SPA 视频格式转换为 DRM FourCC 格式 /// /// PipeWire 使用自己的 VideoFormat 枚举,而 DRM/KMS 使用 FourCC 格式标识。 /// 此函数建立了两者之间的映射关系。 /// /// 支持的格式: /// 不支持的格式返回 0 /// DRM 格式名描述像素值位布局(大端序),而非内存字节序。 /// 例如 DRM_FORMAT_ARGB8888 在小端 x86 上内存为 [B,G,R,A] = PipeWire BGRA。 pub(super) fn spa_to_drm_fourcc(format: libspa::param::video::VideoFormat) -> u32 { use drm_fourcc::DrmFourcc; use libspa::param::video::VideoFormat; match format { VideoFormat::BGRA => DrmFourcc::Argb8888 as u32, VideoFormat::BGRx => DrmFourcc::Xrgb8888 as u32, VideoFormat::RGBA => DrmFourcc::Abgr8888 as u32, VideoFormat::RGBx => DrmFourcc::Xbgr8888 as u32, VideoFormat::ARGB => DrmFourcc::Bgra8888 as u32, VideoFormat::xRGB => DrmFourcc::Bgrx8888 as u32, VideoFormat::ABGR => DrmFourcc::Rgba8888 as u32, VideoFormat::xBGR => DrmFourcc::Rgbx8888 as u32, _ => 0, } } #[cfg(test)] mod tests { use super::*; use drm_fourcc::DrmFourcc; #[test] fn spa_to_drm_fourcc_all_32bit() { use libspa::param::video::VideoFormat; assert_eq!( spa_to_drm_fourcc(VideoFormat::BGRA), DrmFourcc::Argb8888 as u32 ); assert_eq!( spa_to_drm_fourcc(VideoFormat::BGRx), DrmFourcc::Xrgb8888 as u32 ); assert_eq!( spa_to_drm_fourcc(VideoFormat::RGBA), DrmFourcc::Abgr8888 as u32 ); assert_eq!( spa_to_drm_fourcc(VideoFormat::RGBx), DrmFourcc::Xbgr8888 as u32 ); assert_eq!( spa_to_drm_fourcc(VideoFormat::ARGB), DrmFourcc::Bgra8888 as u32 ); assert_eq!( spa_to_drm_fourcc(VideoFormat::xRGB), DrmFourcc::Bgrx8888 as u32 ); assert_eq!( spa_to_drm_fourcc(VideoFormat::ABGR), DrmFourcc::Rgba8888 as u32 ); assert_eq!( spa_to_drm_fourcc(VideoFormat::xBGR), DrmFourcc::Rgbx8888 as u32 ); } #[test] fn spa_to_drm_fourcc_unsupported() { use libspa::param::video::VideoFormat; assert_eq!(spa_to_drm_fourcc(VideoFormat::NV12), 0); } }