Skip to main content

lumen_engine/media/
resolver.rs

1use std::sync::Arc;
2
3use crate::error::MediaError;
4
5#[derive(Debug, Clone)]
6pub struct CpuMediaFrame {
7    pub rgba: Arc<Vec<u8>>,
8    pub width: u32,
9    pub height: u32,
10    pub row_bytes: usize,
11}
12
13#[derive(Debug, Clone)]
14pub enum MediaFrame {
15    CpuRgba(Arc<CpuMediaFrame>),
16    #[cfg(feature = "ffmpeg")]
17    GpuVideo(Arc<GpuVideoMediaFrame>),
18    ExternalTexture(ExternalTextureFrame),
19}
20
21#[cfg(feature = "ffmpeg")]
22#[derive(Debug)]
23pub struct GpuVideoMediaFrame {
24    pub frame: lumen_ffmpeg::GpuVideoFrame,
25}
26
27#[cfg(feature = "ffmpeg")]
28impl GpuVideoMediaFrame {
29    pub fn dimensions(&self) -> (u32, u32) {
30        self.frame.dimensions()
31    }
32}
33
34#[derive(Debug, Clone)]
35pub struct ExternalTextureFrame {
36    pub width: u32,
37    pub height: u32,
38    pub format: lumen_gpu::wgpu::TextureFormat,
39    pub handle: ExternalTextureHandle,
40}
41
42#[derive(Debug, Clone)]
43pub enum ExternalTextureHandle {
44    WgpuTexture(Arc<lumen_gpu::wgpu::Texture>),
45    Platform(String),
46}
47
48#[derive(Debug, Clone, Copy, Default)]
49pub struct ImageMetadata {
50    pub width: u32,
51    pub height: u32,
52}
53
54#[derive(Debug, Clone, Copy, Default)]
55pub struct VideoMetadata {
56    pub width: u32,
57    pub height: u32,
58    pub frame_count: u32,
59    pub fps: f32,
60}
61
62pub trait ImageResolver: Send + Sync {
63    fn id(&self) -> &str;
64
65    fn metadata(&self) -> ImageMetadata;
66
67    fn frame(&self) -> Result<MediaFrame, MediaError>;
68}
69
70pub trait VideoFrameResolver: Send + Sync {
71    fn id(&self) -> &str;
72
73    fn metadata(&self) -> VideoMetadata;
74
75    fn enqueue_frame(&self, _frame: u32) -> Result<(), MediaError> {
76        Ok(())
77    }
78
79    fn frame(&self, frame: u32) -> Result<MediaFrame, MediaError>;
80
81    fn retain_frames(&self, _frames: &[u32]) {}
82}
83
84pub trait FontResolver: Send + Sync {
85    fn id(&self) -> &str;
86
87    fn data(&self) -> Result<Vec<Vec<u8>>, MediaError>;
88}