ff_encode/audio/
codec_options.rs1#[derive(Debug, Clone)]
16pub enum AudioCodecOptions {
17 Opus(OpusOptions),
19 Aac(AacOptions),
21 Mp3(Mp3Options),
23 Flac(FlacOptions),
25}
26
27#[derive(Debug, Clone)]
31pub struct OpusOptions {
32 pub application: OpusApplication,
34 pub frame_duration_ms: Option<u32>,
41}
42
43impl Default for OpusOptions {
44 fn default() -> Self {
45 Self {
46 application: OpusApplication::Audio,
47 frame_duration_ms: None,
48 }
49 }
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
54pub enum OpusApplication {
55 #[default]
57 Audio,
58 Voip,
60 LowDelay,
62}
63
64impl OpusApplication {
65 pub(super) fn as_str(self) -> &'static str {
66 match self {
67 Self::Audio => "audio",
68 Self::Voip => "voip",
69 Self::LowDelay => "lowdelay",
70 }
71 }
72}
73
74#[derive(Debug, Clone)]
78pub struct AacOptions {
79 pub profile: AacProfile,
85 pub vbr_quality: Option<u8>,
92}
93
94impl Default for AacOptions {
95 fn default() -> Self {
96 Self {
97 profile: AacProfile::Lc,
98 vbr_quality: None,
99 }
100 }
101}
102
103#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
105pub enum AacProfile {
106 #[default]
108 Lc,
109 He,
111 Hev2,
113}
114
115impl AacProfile {
116 pub(super) fn as_str(self) -> &'static str {
117 match self {
118 Self::Lc => "aac_low",
119 Self::He => "aac_he",
120 Self::Hev2 => "aac_he_v2",
121 }
122 }
123}
124
125#[derive(Debug, Clone, Copy, PartialEq, Eq)]
129pub enum Mp3Quality {
130 Vbr(u8),
135 Cbr(u32),
137}
138
139#[derive(Debug, Clone)]
141pub struct Mp3Options {
142 pub quality: Mp3Quality,
144}
145
146impl Default for Mp3Options {
147 fn default() -> Self {
148 Self {
149 quality: Mp3Quality::Vbr(4),
150 }
151 }
152}
153
154#[derive(Debug, Clone)]
158pub struct FlacOptions {
159 pub compression_level: u8,
161}
162
163impl Default for FlacOptions {
164 fn default() -> Self {
165 Self {
166 compression_level: 5,
167 }
168 }
169}
170
171#[cfg(test)]
172mod tests {
173 use super::*;
174
175 #[test]
176 fn opus_application_should_return_correct_str() {
177 assert_eq!(OpusApplication::Audio.as_str(), "audio");
178 assert_eq!(OpusApplication::Voip.as_str(), "voip");
179 assert_eq!(OpusApplication::LowDelay.as_str(), "lowdelay");
180 }
181
182 #[test]
183 fn opus_options_default_should_have_audio_application_and_no_frame_duration() {
184 let opts = OpusOptions::default();
185 assert_eq!(opts.application, OpusApplication::Audio);
186 assert!(opts.frame_duration_ms.is_none());
187 }
188
189 #[test]
190 fn aac_profile_should_return_correct_str() {
191 assert_eq!(AacProfile::Lc.as_str(), "aac_low");
192 assert_eq!(AacProfile::He.as_str(), "aac_he");
193 assert_eq!(AacProfile::Hev2.as_str(), "aac_he_v2");
194 }
195
196 #[test]
197 fn aac_options_default_should_have_lc_profile_and_no_vbr() {
198 let opts = AacOptions::default();
199 assert_eq!(opts.profile, AacProfile::Lc);
200 assert!(opts.vbr_quality.is_none());
201 }
202
203 #[test]
204 fn mp3_options_default_should_have_vbr_quality_4() {
205 let opts = Mp3Options::default();
206 assert_eq!(opts.quality, Mp3Quality::Vbr(4));
207 }
208
209 #[test]
210 fn mp3_quality_enum_variants_are_accessible() {
211 let _vbr = Mp3Quality::Vbr(0);
212 let _cbr = Mp3Quality::Cbr(192_000);
213 }
214
215 #[test]
216 fn flac_options_default_should_have_compression_level_5() {
217 let opts = FlacOptions::default();
218 assert_eq!(opts.compression_level, 5);
219 }
220
221 #[test]
222 fn audio_codec_options_enum_variants_are_accessible() {
223 let _opus = AudioCodecOptions::Opus(OpusOptions::default());
224 let _aac = AudioCodecOptions::Aac(AacOptions::default());
225 let _mp3 = AudioCodecOptions::Mp3(Mp3Options::default());
226 let _flac = AudioCodecOptions::Flac(FlacOptions::default());
227 }
228}