Skip to content

Commit

Permalink
allow adjusting keyframe interval through EncoderSettings
Browse files Browse the repository at this point in the history
  • Loading branch information
gerwin3 committed Aug 30, 2024
1 parent cf0d4d6 commit c8421b0
Showing 1 changed file with 20 additions and 3 deletions.
23 changes: 20 additions & 3 deletions src/encode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ pub struct Encoder {
writer_stream_index: usize,
encoder: AvEncoder,
encoder_time_base: AvRational,
keyframe_interval: u64,
interleaved: bool,
scaler: AvScaler,
scaler_width: u32,
Expand All @@ -129,8 +130,6 @@ pub struct Encoder {
}

impl Encoder {
const KEY_FRAME_INTERVAL: u64 = 12;

/// Create an encoder with the specified destination and settings.
///
/// * `destination` - Where to encode to.
Expand Down Expand Up @@ -190,7 +189,7 @@ impl Encoder {
// Reformat frame to target pixel format.
let mut frame = self.scale(frame)?;
// Producer key frame every once in a while
if self.frame_count % Self::KEY_FRAME_INTERVAL == 0 {
if self.frame_count % self.keyframe_interval == 0 {
frame.set_kind(AvFrameType::I);
}

Expand Down Expand Up @@ -284,6 +283,7 @@ impl Encoder {
writer_stream_index,
encoder,
encoder_time_base,
keyframe_interval: settings.keyframe_interval,
interleaved,
scaler,
scaler_width,
Expand Down Expand Up @@ -385,10 +385,14 @@ pub struct Settings {
width: u32,
height: u32,
pixel_format: AvPixel,
keyframe_interval: u64,
options: Options,
}

impl Settings {
/// Default keyframe interval.
const KEY_FRAME_INTERVAL: u64 = 12;

/// This is the assumed FPS for the encoder to use. Note that this does not need to be correct
/// exactly.
const FRAME_RATE: i32 = 30;
Expand All @@ -407,6 +411,7 @@ impl Settings {
width: width as u32,
height: height as u32,
pixel_format: AvPixel::YUV420P,
keyframe_interval: Self::KEY_FRAME_INTERVAL,
options,
}
}
Expand Down Expand Up @@ -435,10 +440,22 @@ impl Settings {
width: width as u32,
height: height as u32,
pixel_format,
keyframe_interval: Self::KEY_FRAME_INTERVAL,
options,
}
}

/// Set the keyframe interval.
pub fn set_keyframe_interval(&mut self, keyframe_interval: u64) {
self.keyframe_interval = keyframe_interval;
}

/// Set the keyframe interval.
pub fn with_keyframe_interval(mut self, keyframe_interval: u64) -> Self {
self.set_keyframe_interval(keyframe_interval);
self
}

/// Apply the settings to an encoder.
///
/// # Arguments
Expand Down

0 comments on commit c8421b0

Please sign in to comment.