lumen_engine/media/
resolver.rs1use 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}