selene_core/config/common/
encoding.rs1use std::process::Command;
2
3use serde::{Deserialize, Serialize};
4
5use crate::media_container::{Codec, ContainerFormat};
6
7pub const BITRATE_128K: u32 = 128_000;
8pub const BITRATE_192K: u32 = 192_000;
9pub const BITRATE_256K: u32 = 256_000;
10pub const BITRATE_320K: u32 = 320_000;
11
12#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
13pub struct TranscodeSettings {
14 pub from_format: Option<ContainerFormat>,
15 pub from_codec: Option<Codec>,
16 pub target: TranscodeTarget,
17}
18
19impl TranscodeSettings {
20 #[must_use]
21 pub fn to_flac(from_format: Option<ContainerFormat>, from_codec: Option<Codec>) -> Self {
22 Self {
23 from_format,
24 from_codec,
25 target: TranscodeTarget::Flac(FlacEncoderSettings::default()),
26 }
27 }
28
29 #[must_use]
30 pub fn is_lossless(&self) -> bool {
31 matches!(self.target, TranscodeTarget::Flac(_))
32 }
33
34 pub fn add_ffmpeg_args(&self, command: &mut Command) {
35 match self.target {
36 TranscodeTarget::Flac(flac_encoder_settings) => {
37 flac_encoder_settings.add_ffmpeg_args(command);
38 }
39 }
40 }
41
42 #[must_use]
43 pub fn container_codec(&self) -> (ContainerFormat, Codec) {
44 match self.target {
45 TranscodeTarget::Flac(_) => (ContainerFormat::Flac, Codec::Flac),
46 }
47 }
48}
49
50#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
51pub enum TranscodeTarget {
52 Flac(FlacEncoderSettings),
53}
54
55#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
56pub struct FlacEncoderSettings {
57 pub compression_level: u8,
58}
59
60impl FlacEncoderSettings {
61 pub fn add_ffmpeg_args(&self, command: &mut Command) {
62 command
63 .args(["-f", "flac", "-c:a", "flac", "-compression_level"])
64 .arg(self.compression_level.to_string());
65 }
66}
67
68impl Default for FlacEncoderSettings {
69 fn default() -> Self {
70 Self {
71 compression_level: 5,
72 }
73 }
74}