1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#[derive(Debug, Clone, PartialEq)]
pub enum FfmpegEvent {
ParsedVersion(FfmpegVersion),
ParsedConfiguration(FfmpegConfiguration),
ParsedStreamMapping(String),
ParsedOutput(FfmpegOutput),
ParsedInputStream(AVStream),
ParsedOutputStream(AVStream),
Log(LogLevel, String),
LogEOF,
Error(String),
Progress(FfmpegProgress),
OutputFrame(OutputVideoFrame),
OutputChunk(Vec<u8>),
Done,
}
#[derive(Debug, Clone, PartialEq)]
pub enum LogLevel {
Info,
Warning,
Error,
Fatal,
Unknown,
}
#[derive(Debug, Clone, PartialEq)]
pub struct FfmpegOutput {
pub to: String,
pub index: u32,
pub raw_log_message: String,
}
impl FfmpegOutput {
pub fn is_stdout(&self) -> bool {
["pipe", "pipe:", "pipe:1"].contains(&self.to.as_str())
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct AVStream {
pub format: String,
pub pix_fmt: String,
pub width: u32,
pub height: u32,
pub fps: f32,
pub parent_index: usize,
pub raw_log_message: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct FfmpegVersion {
pub version: String,
pub raw_log_message: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct FfmpegConfiguration {
pub configuration: Vec<String>,
pub raw_log_message: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct FfmpegProgress {
pub frame: u32,
pub fps: f32,
pub q: f32,
pub size_kb: u32,
pub time: String,
pub bitrate_kbps: f32,
pub speed: f32,
pub raw_log_message: String,
}
#[derive(Clone, PartialEq)]
pub struct OutputVideoFrame {
pub width: u32,
pub height: u32,
pub pix_fmt: String,
pub output_index: u32,
pub data: Vec<u8>,
pub frame_num: u32,
pub timestamp: f32,
}
impl std::fmt::Debug for OutputVideoFrame {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("OutputVideoFrame")
.field("width", &self.width)
.field("height", &self.height)
.field("pix_fmt", &self.pix_fmt)
.field("output_index", &self.output_index)
.finish()
}
}