ffmpeg-pipeline 0.2.0

Composable FFmpeg decoding, encoding, remuxing, and media I/O for Rust
Documentation
use super::*;
use ffmpeg_next::{channel_layout::ChannelLayout, Rational};

pub enum EncodeParams {
    Audio {
        bitrate: usize,
        channel_layout: ChannelLayout,
        compression: Option<usize>,
        global_header: bool,
        rate: i32,
        time_base: Rational,
        vbr: bool,
    },
    Video {
        time_base: Rational,
        global_header: bool,
    },
}

impl EncodeParams {
    pub fn time_base(&self) -> Rational {
        match self {
            EncodeParams::Audio { time_base, .. } => *time_base,
            EncodeParams::Video { time_base, .. } => *time_base,
        }
    }

    pub fn with_bitrate(self, bitrate: usize) -> Self {
        if let Self::Audio {
            channel_layout,
            compression,
            global_header,
            rate,
            time_base,
            vbr,
            ..
        } = self
        {
            Self::Audio {
                bitrate,
                channel_layout,
                compression,
                global_header,
                rate,
                time_base,
                vbr,
            }
        } else {
            self
        }
    }

    pub fn with_compression(self, compression: Option<usize>) -> Self {
        if let Self::Audio {
            bitrate,
            channel_layout,
            global_header,
            rate,
            time_base,
            vbr,
            ..
        } = self
        {
            Self::Audio {
                bitrate,
                channel_layout,
                compression,
                global_header,
                rate,
                time_base,
                vbr,
            }
        } else {
            self
        }
    }

    pub fn with_vbr(self, vbr: bool) -> Self {
        if let Self::Audio {
            bitrate,
            channel_layout,
            compression,
            global_header,
            rate,
            time_base,
            ..
        } = self
        {
            Self::Audio {
                bitrate,
                channel_layout,
                compression,
                global_header,
                rate,
                time_base,
                vbr,
            }
        } else {
            self
        }
    }
}

impl Default for EncodeParams {
    fn default() -> Self {
        EncodeParams::Audio {
            bitrate: 128 * 1024,
            channel_layout: ChannelLayout::STEREO,
            compression: None,
            global_header: false,
            rate: 44100,
            time_base: Rational::new(1, 44100),
            vbr: false,
        }
    }
}

impl From<&Decoder<'_>> for EncodeParams {
    fn from(decoder: &Decoder<'_>) -> Self {
        match decoder.get_decoder() {
            StreamDecoder::Audio(decoder) => EncodeParams::Audio {
                bitrate: decoder.bit_rate(),
                rate: decoder.rate() as i32,
                channel_layout: decoder_channel_layout(decoder),
                compression: None,
                time_base: decoder.time_base(),
                global_header: false,
                vbr: false,
            },
            StreamDecoder::Video(decoder) => EncodeParams::Video {
                time_base: decoder.time_base(),
                global_header: false,
            },
        }
    }
}