Skip to main content

oximedia_transcode/presets/
broadcast.rs

1//! Broadcast and professional proxy presets.
2
3use crate::{PresetConfig, QualityMode};
4
5/// Broadcast HD `ProRes` Proxy (1280x720).
6///
7/// Note: This uses H.264 as a substitute since we use royalty-free codecs.
8/// In a commercial setting, this would use `ProRes`.
9#[must_use]
10pub fn prores_proxy_hd() -> PresetConfig {
11    PresetConfig {
12        video_codec: Some("h264".to_string()),
13        audio_codec: Some("aac".to_string()),
14        video_bitrate: Some(45_000_000), // 45 Mbps (ProRes Proxy equivalent)
15        audio_bitrate: Some(256_000),
16        width: Some(1280),
17        height: Some(720),
18        frame_rate: Some((25, 1)), // PAL
19        quality_mode: Some(QualityMode::VeryHigh),
20        container: Some("mp4".to_string()),
21        audio_channel_layout: None,
22    }
23}
24
25/// Broadcast Full HD `ProRes` Proxy (1920x1080).
26#[must_use]
27pub fn prores_proxy_full_hd() -> PresetConfig {
28    PresetConfig {
29        video_codec: Some("h264".to_string()),
30        audio_codec: Some("aac".to_string()),
31        video_bitrate: Some(90_000_000), // 90 Mbps
32        audio_bitrate: Some(256_000),
33        width: Some(1920),
34        height: Some(1080),
35        frame_rate: Some((25, 1)),
36        quality_mode: Some(QualityMode::VeryHigh),
37        container: Some("mp4".to_string()),
38        audio_channel_layout: None,
39    }
40}
41
42/// Broadcast 4K `ProRes` Proxy (3840x2160).
43#[must_use]
44pub fn prores_proxy_4k() -> PresetConfig {
45    PresetConfig {
46        video_codec: Some("h264".to_string()),
47        audio_codec: Some("aac".to_string()),
48        video_bitrate: Some(180_000_000), // 180 Mbps
49        audio_bitrate: Some(320_000),
50        width: Some(3840),
51        height: Some(2160),
52        frame_rate: Some((25, 1)),
53        quality_mode: Some(QualityMode::VeryHigh),
54        container: Some("mp4".to_string()),
55        audio_channel_layout: None,
56    }
57}
58
59/// `DNxHD` proxy for Avid (1920x1080).
60///
61/// Note: This uses H.264 as a substitute for `DNxHD`.
62#[must_use]
63pub fn dnxhd_proxy() -> PresetConfig {
64    PresetConfig {
65        video_codec: Some("h264".to_string()),
66        audio_codec: Some("aac".to_string()),
67        video_bitrate: Some(36_000_000), // 36 Mbps (DNxHD 36)
68        audio_bitrate: Some(256_000),
69        width: Some(1920),
70        height: Some(1080),
71        frame_rate: Some((24, 1)),
72        quality_mode: Some(QualityMode::VeryHigh),
73        container: Some("mp4".to_string()),
74        audio_channel_layout: None,
75    }
76}
77
78/// EBU R128 compliant broadcast preset (1920x1080).
79#[must_use]
80pub fn ebu_r128_hd() -> PresetConfig {
81    PresetConfig {
82        video_codec: Some("h264".to_string()),
83        audio_codec: Some("aac".to_string()),
84        video_bitrate: Some(50_000_000), // 50 Mbps
85        audio_bitrate: Some(384_000),    // High-quality audio
86        width: Some(1920),
87        height: Some(1080),
88        frame_rate: Some((25, 1)), // PAL
89        quality_mode: Some(QualityMode::VeryHigh),
90        container: Some("mp4".to_string()),
91        audio_channel_layout: None,
92    }
93}
94
95/// ATSC A/85 compliant broadcast preset (1920x1080).
96#[must_use]
97pub fn atsc_a85_hd() -> PresetConfig {
98    PresetConfig {
99        video_codec: Some("h264".to_string()),
100        audio_codec: Some("aac".to_string()),
101        video_bitrate: Some(50_000_000), // 50 Mbps
102        audio_bitrate: Some(384_000),
103        width: Some(1920),
104        height: Some(1080),
105        frame_rate: Some((30000, 1001)), // 29.97 fps (NTSC)
106        quality_mode: Some(QualityMode::VeryHigh),
107        container: Some("mp4".to_string()),
108        audio_channel_layout: None,
109    }
110}
111
112#[cfg(test)]
113mod tests {
114    use super::*;
115
116    #[test]
117    fn test_prores_proxy_hd() {
118        let preset = prores_proxy_hd();
119        assert_eq!(preset.width, Some(1280));
120        assert_eq!(preset.height, Some(720));
121        assert_eq!(preset.frame_rate, Some((25, 1)));
122    }
123
124    #[test]
125    fn test_prores_proxy_4k() {
126        let preset = prores_proxy_4k();
127        assert_eq!(preset.width, Some(3840));
128        assert_eq!(preset.height, Some(2160));
129        assert_eq!(preset.video_bitrate, Some(180_000_000));
130    }
131
132    #[test]
133    fn test_ebu_r128() {
134        let preset = ebu_r128_hd();
135        assert_eq!(preset.frame_rate, Some((25, 1))); // PAL
136        assert_eq!(preset.audio_bitrate, Some(384_000));
137    }
138
139    #[test]
140    fn test_atsc_a85() {
141        let preset = atsc_a85_hd();
142        assert_eq!(preset.frame_rate, Some((30000, 1001))); // 29.97 fps
143    }
144}