introduce a way for encoder to manifest its capabilities
authorKostya Shishkov <kostya.shishkov@gmail.com>
Tue, 14 Mar 2023 10:11:31 +0000 (11:11 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Tue, 14 Mar 2023 10:11:31 +0000 (11:11 +0100)
14 files changed:
nihav-commonfmt/src/codecs/cinepakenc.rs
nihav-commonfmt/src/codecs/pcm.rs
nihav-commonfmt/src/codecs/zmbvenc.rs
nihav-core/src/codecs/mod.rs
nihav-duck/src/codecs/truemotionrtenc.rs
nihav-duck/src/codecs/vp6enc/mod.rs
nihav-duck/src/codecs/vp7enc/mod.rs
nihav-flash/src/codecs/adpcmenc.rs
nihav-indeo/src/codecs/indeo3enc/mod.rs
nihav-llaudio/src/codecs/flacenc.rs
nihav-ms/src/codecs/imaadpcmenc.rs
nihav-ms/src/codecs/msadpcm.rs
nihav-ms/src/codecs/msvideo1enc.rs
nihav-realmedia/src/codecs/cookenc.rs

index ff86a524e4044781da66bf45543c161ac6792133..f4ac9b24fd375c52b4f5717fcb4aac1fbd3e2e42 100644 (file)
@@ -958,6 +958,7 @@ impl NAEncoder for CinepakEncoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { 0 }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index 3bc67c007f04461ac2262c6504ba949d661d49fc..b2dd8174879e75bc9f518fb5cca2e1255d5f8291 100644 (file)
@@ -200,6 +200,7 @@ impl NAEncoder for PCMEncoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { ENC_CAPS_CBR }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index 0c8b945f8fb4c716fb704bc18a527b7f8f44b673..332cc0e47b9230c44dd6cdd8f754c5f4b290dfc2 100644 (file)
@@ -398,6 +398,7 @@ impl NAEncoder for ZMBVEncoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { ENC_CAPS_SKIPFRAME }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index b6a1820d6bcf6bb87b3c9cad6f0c41aea7af6dc4..5cf7d07b1eb1b230e5883e34f534d268e2f06ea7 100644 (file)
@@ -210,6 +210,13 @@ pub const ENC_MODE_CBR: u64 = 1 << 0;
 /// Encoding parameter flag to force constant framerate mode.
 pub const ENC_MODE_CFR: u64 = 1 << 1;
 
+/// Encoder supports constant bitrate mode.
+pub const ENC_CAPS_CBR: u64 = 1 << 0;
+/// Encoder supports skip frames.
+pub const ENC_CAPS_SKIPFRAME: u64 = 1 << 1;
+/// Encoder supports mid-stream parameters change.
+pub const ENC_CAPS_PARAMCHANGE: u64 = 1 << 2;
+
 /// Encoding parameters.
 #[derive(Clone,Copy,PartialEq)]
 pub struct EncodeParameters {
@@ -300,6 +307,10 @@ pub trait NAEncoder: NAOptionHandler {
     /// // convert input into format defined in target_params, feed to the encoder, ...
     /// ```
     fn negotiate_format(&self, encinfo: &EncodeParameters) -> EncoderResult<EncodeParameters>;
+    /// Queries encoder capabilities.
+    ///
+    /// See `ENC_CAPS_*` for examples.
+    fn get_capabilities(&self) -> u64;
     /// Initialises the encoder.
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef>;
     /// Takes a single frame for encoding.
index c80a4b84843b3f20e6a8ed8bf261f9b9bf958eaa..47236ddbb1e1c88ab67c2320dd475e34f0ec3bcf 100644 (file)
@@ -181,6 +181,7 @@ impl NAEncoder for TMRTEncoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { ENC_CAPS_PARAMCHANGE }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index d706fe74a6e0bac356e1a07115358151e5f1755a..9eea91d7f041c460bc658720444e0e8f75870c06 100644 (file)
@@ -680,6 +680,7 @@ impl NAEncoder for VP6Encoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { 0 }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index 8a31f10f47a0e564b6da89b204df01efd1178177..a73a5713976ee8d1f8480e1e80cf62d94b2b0261 100644 (file)
@@ -280,6 +280,7 @@ impl NAEncoder for VP7Encoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { 0 }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index 9cd04f7b30b9e49fef784fdef705fc2bd4f7cf55..c7bf3aad6293e6999e85e35a9a2d713e161b4395 100644 (file)
@@ -81,6 +81,7 @@ impl NAEncoder for ADPCMEncoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { ENC_CAPS_CBR }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index dc638bc791c14b872ad87e3c55d2f208b73defdc..eefa3d7b94bcb95fb6aae470bb3eb79e6886b651 100644 (file)
@@ -199,6 +199,7 @@ impl NAEncoder for Indeo3Encoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { ENC_CAPS_SKIPFRAME }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index 8b5b44decdff16272799cf3b81641d026e6ae33a..3b992941c6841b681ba4d520bb7cdb0e83a2af7a 100644 (file)
@@ -417,6 +417,7 @@ impl NAEncoder for FLACEncoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { 0 }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index 15e76fb251a7473bcff2b1ca80fb0a4c3a58e234..a113d5d3e0e47be3be0a6364c190d6613df68ede 100644 (file)
@@ -215,6 +215,7 @@ impl NAEncoder for IMAADPCMEncoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { ENC_CAPS_CBR }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index 768eb749bf025f14211cff49802cd765b7da4335..179b097515f95ffa27a05edc78647928fb6f8725 100644 (file)
@@ -336,6 +336,7 @@ impl NAEncoder for MSADPCMEncoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { ENC_CAPS_CBR }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index 5d50b9af856146eb93c409287231f5fdc9dbf651..4507e08ec7bfff1f7d3251d4d059b29c494a2bc1 100644 (file)
@@ -835,6 +835,7 @@ impl NAEncoder for MSVideo1Encoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { ENC_CAPS_SKIPFRAME }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),
index 70f471b8c373c60b7d2db0ecd5430cd1ca2b7c1e..3b9e3c4c76a0276c8b501a41da1415a1b5896bae 100644 (file)
@@ -768,6 +768,7 @@ impl NAEncoder for CookEncoder {
             }
         }
     }
+    fn get_capabilities(&self) -> u64 { ENC_CAPS_CBR }
     fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
         match encinfo.format {
             NACodecTypeInfo::None => Err(EncoderError::FormatError),