diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2020-06-06 09:54:30 +0200 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2020-06-06 12:49:45 +0200 |
commit | c9c7f64823f07e1e1dcd3d4a78ef149bf29fc7f5 (patch) | |
tree | ccc6acc806d9d54f7e726de7dc8a5727c71767b4 | |
parent | 8211e0aadd003c6b02c6f7e8efc9f3930eb9d502 (diff) | |
download | nihav-c9c7f64823f07e1e1dcd3d4a78ef149bf29fc7f5.tar.gz |
msvideo1enc: add keyframe interval option
-rw-r--r-- | nihav-ms/src/codecs/msvideo1enc.rs | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/nihav-ms/src/codecs/msvideo1enc.rs b/nihav-ms/src/codecs/msvideo1enc.rs index 41d5ff7..6dd5a60 100644 --- a/nihav-ms/src/codecs/msvideo1enc.rs +++ b/nihav-ms/src/codecs/msvideo1enc.rs @@ -256,6 +256,7 @@ struct MSVideo1Encoder { lastfrm: Option<NAVideoBufferRef<u16>>, quality: u8, frmcount: u8, + key_int: u8, } impl MSVideo1Encoder { @@ -267,6 +268,7 @@ impl MSVideo1Encoder { lastfrm: None, quality: 0, frmcount: 0, + key_int: 25, } } fn get_block(src: &[u16], sstride: usize, buf: &mut [Pixel16; 16]) { @@ -462,7 +464,7 @@ impl NAEncoder for MSVideo1Encoder { self.lastfrm = Some(cur_frm); self.pkt = Some(NAPacket::new(self.stream.clone().unwrap(), frm.ts, is_intra, dbuf)); self.frmcount += 1; - if self.frmcount == 25 { + if self.frmcount == self.key_int { self.frmcount = 0; } Ok(()) @@ -481,10 +483,36 @@ impl NAEncoder for MSVideo1Encoder { } } +const ENCODER_OPTS: &[NAOptionDefinition] = &[ + NAOptionDefinition { + name: KEYFRAME_OPTION, description: KEYFRAME_OPTION_DESC, + opt_type: NAOptionDefinitionType::Int(Some(0), Some(128)) }, +]; + impl NAOptionHandler for MSVideo1Encoder { - fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } - fn set_options(&mut self, _options: &[NAOption]) { } - fn query_option_value(&self, _name: &str) -> Option<NAValue> { None } + fn get_supported_options(&self) -> &[NAOptionDefinition] { ENCODER_OPTS } + fn set_options(&mut self, options: &[NAOption]) { + for option in options.iter() { + for opt_def in ENCODER_OPTS.iter() { + if opt_def.check(option).is_ok() { + match option.name { + KEYFRAME_OPTION => { + if let NAValue::Int(intval) = option.value { + self.key_int = intval as u8; + } + }, + _ => {}, + }; + } + } + } + } + fn query_option_value(&self, name: &str) -> Option<NAValue> { + match name { + KEYFRAME_OPTION => Some(NAValue::Int(i64::from(self.key_int))), + _ => None, + } + } } pub fn get_encoder() -> Box<dyn NAEncoder + Send> { |