aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2020-06-06 09:54:30 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2020-06-06 12:49:45 +0200
commitc9c7f64823f07e1e1dcd3d4a78ef149bf29fc7f5 (patch)
treeccc6acc806d9d54f7e726de7dc8a5727c71767b4
parent8211e0aadd003c6b02c6f7e8efc9f3930eb9d502 (diff)
downloadnihav-c9c7f64823f07e1e1dcd3d4a78ef149bf29fc7f5.tar.gz
msvideo1enc: add keyframe interval option
-rw-r--r--nihav-ms/src/codecs/msvideo1enc.rs36
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> {