Skip to main content

selene_core/config/common/
encoding.rs

1use 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}