Skip to main content

ff_encode/video/builder/
video.rs

1//! Video stream settings for [`VideoEncoderBuilder`].
2
3use super::VideoEncoderBuilder;
4use crate::{BitrateMode, HardwareEncoder, Preset, VideoCodec};
5
6impl VideoEncoderBuilder {
7    /// Configure video stream settings.
8    #[must_use]
9    pub fn video(mut self, width: u32, height: u32, fps: f64) -> Self {
10        self.video_width = Some(width);
11        self.video_height = Some(height);
12        self.video_fps = Some(fps);
13        self
14    }
15
16    /// Set video codec.
17    #[must_use]
18    pub fn video_codec(mut self, codec: VideoCodec) -> Self {
19        self.video_codec = codec;
20        self.video_codec_explicit = true;
21        self
22    }
23
24    /// Set the bitrate control mode for video encoding.
25    #[must_use]
26    pub fn bitrate_mode(mut self, mode: BitrateMode) -> Self {
27        self.video_bitrate_mode = Some(mode);
28        self
29    }
30
31    /// Set encoding preset (speed vs quality tradeoff).
32    #[must_use]
33    pub fn preset(mut self, preset: Preset) -> Self {
34        self.preset = preset;
35        self
36    }
37
38    /// Set hardware encoder.
39    #[must_use]
40    pub fn hardware_encoder(mut self, hw: HardwareEncoder) -> Self {
41        self.hardware_encoder = hw;
42        self
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49    use std::path::PathBuf;
50
51    #[test]
52    fn builder_video_settings_should_be_stored() {
53        let builder = VideoEncoderBuilder::new(PathBuf::from("output.mp4"))
54            .video(1920, 1080, 30.0)
55            .video_codec(VideoCodec::H264)
56            .bitrate_mode(BitrateMode::Cbr(8_000_000));
57        assert_eq!(builder.video_width, Some(1920));
58        assert_eq!(builder.video_height, Some(1080));
59        assert_eq!(builder.video_fps, Some(30.0));
60        assert_eq!(builder.video_codec, VideoCodec::H264);
61        assert_eq!(
62            builder.video_bitrate_mode,
63            Some(BitrateMode::Cbr(8_000_000))
64        );
65    }
66
67    #[test]
68    fn builder_preset_should_be_stored() {
69        let builder = VideoEncoderBuilder::new(PathBuf::from("output.mp4"))
70            .video(1920, 1080, 30.0)
71            .preset(Preset::Fast);
72        assert_eq!(builder.preset, Preset::Fast);
73    }
74
75    #[test]
76    fn builder_hardware_encoder_should_be_stored() {
77        let builder = VideoEncoderBuilder::new(PathBuf::from("output.mp4"))
78            .video(1920, 1080, 30.0)
79            .hardware_encoder(HardwareEncoder::Nvenc);
80        assert_eq!(builder.hardware_encoder, HardwareEncoder::Nvenc);
81    }
82}