Skip to main content

oximedia_transcode/presets/
archive.rs

1//! Archive and preservation presets for long-term storage.
2
3use crate::{PresetConfig, QualityMode};
4
5/// Lossless archival preset using VP9 (best compression).
6///
7/// Note: In a real implementation, this would use FFV1 for true lossless.
8/// VP9 lossless mode is used here as it's part of our royalty-free codec set.
9#[must_use]
10pub fn lossless_vp9() -> PresetConfig {
11    PresetConfig {
12        video_codec: Some("vp9".to_string()),
13        audio_codec: Some("opus".to_string()),
14        video_bitrate: None, // Lossless mode
15        audio_bitrate: Some(256_000),
16        width: None,      // Preserve source resolution
17        height: None,     // Preserve source resolution
18        frame_rate: None, // Preserve source frame rate
19        quality_mode: Some(QualityMode::VeryHigh),
20        container: Some("mkv".to_string()),
21        audio_channel_layout: None,
22    }
23}
24
25/// High-quality archival preset (VP9, near-lossless).
26#[must_use]
27pub fn high_quality_vp9() -> PresetConfig {
28    PresetConfig {
29        video_codec: Some("vp9".to_string()),
30        audio_codec: Some("opus".to_string()),
31        video_bitrate: Some(50_000_000), // 50 Mbps
32        audio_bitrate: Some(256_000),
33        width: None,      // Preserve source
34        height: None,     // Preserve source
35        frame_rate: None, // Preserve source
36        quality_mode: Some(QualityMode::VeryHigh),
37        container: Some("mkv".to_string()),
38        audio_channel_layout: None,
39    }
40}
41
42/// High-quality archival preset (AV1, smaller file size).
43#[must_use]
44pub fn high_quality_av1() -> PresetConfig {
45    PresetConfig {
46        video_codec: Some("av1".to_string()),
47        audio_codec: Some("opus".to_string()),
48        video_bitrate: Some(30_000_000), // 30 Mbps (AV1 more efficient)
49        audio_bitrate: Some(256_000),
50        width: None,
51        height: None,
52        frame_rate: None,
53        quality_mode: Some(QualityMode::VeryHigh),
54        container: Some("mkv".to_string()),
55        audio_channel_layout: None,
56    }
57}
58
59/// Master archival preset (highest quality).
60#[must_use]
61pub fn master_archive() -> PresetConfig {
62    PresetConfig {
63        video_codec: Some("vp9".to_string()),
64        audio_codec: Some("opus".to_string()),
65        video_bitrate: Some(100_000_000), // 100 Mbps
66        audio_bitrate: Some(512_000),     // High-quality audio
67        width: None,
68        height: None,
69        frame_rate: None,
70        quality_mode: Some(QualityMode::VeryHigh),
71        container: Some("mkv".to_string()),
72        audio_channel_layout: None,
73    }
74}
75
76/// Intermediate archival preset (balance of quality and size).
77#[must_use]
78pub fn intermediate_archive() -> PresetConfig {
79    PresetConfig {
80        video_codec: Some("vp9".to_string()),
81        audio_codec: Some("opus".to_string()),
82        video_bitrate: Some(25_000_000), // 25 Mbps
83        audio_bitrate: Some(192_000),
84        width: None,
85        height: None,
86        frame_rate: None,
87        quality_mode: Some(QualityMode::High),
88        container: Some("mkv".to_string()),
89        audio_channel_layout: None,
90    }
91}
92
93/// Preservation preset with metadata (1080p).
94#[must_use]
95pub fn preservation_1080p() -> PresetConfig {
96    PresetConfig {
97        video_codec: Some("vp9".to_string()),
98        audio_codec: Some("opus".to_string()),
99        video_bitrate: Some(20_000_000), // 20 Mbps
100        audio_bitrate: Some(256_000),
101        width: Some(1920),
102        height: Some(1080),
103        frame_rate: Some((24, 1)), // Film standard
104        quality_mode: Some(QualityMode::VeryHigh),
105        container: Some("mkv".to_string()),
106        audio_channel_layout: None,
107    }
108}
109
110/// Preservation preset with metadata (4K).
111#[must_use]
112pub fn preservation_4k() -> PresetConfig {
113    PresetConfig {
114        video_codec: Some("vp9".to_string()),
115        audio_codec: Some("opus".to_string()),
116        video_bitrate: Some(60_000_000), // 60 Mbps
117        audio_bitrate: Some(320_000),
118        width: Some(3840),
119        height: Some(2160),
120        frame_rate: Some((24, 1)),
121        quality_mode: Some(QualityMode::VeryHigh),
122        container: Some("mkv".to_string()),
123        audio_channel_layout: None,
124    }
125}
126
127#[cfg(test)]
128mod tests {
129    use super::*;
130
131    #[test]
132    fn test_lossless_vp9() {
133        let preset = lossless_vp9();
134        assert_eq!(preset.video_codec, Some("vp9".to_string()));
135        assert_eq!(preset.container, Some("mkv".to_string()));
136        assert!(preset.width.is_none()); // Preserve source
137    }
138
139    #[test]
140    fn test_high_quality_av1() {
141        let preset = high_quality_av1();
142        assert_eq!(preset.video_codec, Some("av1".to_string()));
143        assert_eq!(preset.quality_mode, Some(QualityMode::VeryHigh));
144    }
145
146    #[test]
147    fn test_master_archive() {
148        let preset = master_archive();
149        assert_eq!(preset.video_bitrate, Some(100_000_000));
150        assert_eq!(preset.audio_bitrate, Some(512_000));
151    }
152
153    #[test]
154    fn test_preservation_4k() {
155        let preset = preservation_4k();
156        assert_eq!(preset.width, Some(3840));
157        assert_eq!(preset.height, Some(2160));
158        assert_eq!(preset.frame_rate, Some((24, 1)));
159    }
160}