From f1b0db38037cf1113834afbf5b478bcc4e84c588 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Wed, 17 Nov 2021 14:46:04 +0100 Subject: [PATCH] add enabling/disabling features for files with both encoder and decoder --- nihav-commonfmt/src/codecs/pcm.rs | 21 +++++++++++++++++++++ nihav-game/src/codecs/futurevision.rs | 15 +++++++++++++++ nihav-game/src/codecs/mod.rs | 1 + nihav-ms/src/codecs/msadpcm.rs | 11 +++++++++++ 4 files changed, 48 insertions(+) diff --git a/nihav-commonfmt/src/codecs/pcm.rs b/nihav-commonfmt/src/codecs/pcm.rs index 46b1992..29926a5 100644 --- a/nihav-commonfmt/src/codecs/pcm.rs +++ b/nihav-commonfmt/src/codecs/pcm.rs @@ -1,19 +1,23 @@ use nihav_core::formats::*; use nihav_core::codecs::*; +#[cfg(feature="encoder_pcm")] use nihav_core::io::byteio::*; #[derive(Clone,Copy,Debug,PartialEq)] +#[cfg(feature="decoder_pcm")] enum PCMMode { Infinity, ALaw, MuLaw, } +#[cfg(feature="decoder_pcm")] struct PCMDecoder { chmap: NAChannelMap, mode: PCMMode, } +#[cfg(feature="decoder_pcm")] fn cvt_alaw(val: u8) -> i16 { let val = val ^ 0x55; let sign = (val & 0x80) != 0; @@ -23,6 +27,7 @@ fn cvt_alaw(val: u8) -> i16 { if sign { aval } else { -aval } } +#[cfg(feature="decoder_pcm")] fn cvt_mulaw(val: u8) -> i16 { let val = !val; let sign = (val & 0x80) != 0; @@ -32,6 +37,7 @@ fn cvt_mulaw(val: u8) -> i16 { if !sign { aval } else { -aval } } +#[cfg(feature="decoder_pcm")] impl PCMDecoder { fn new(mode: PCMMode) -> Self { PCMDecoder { chmap: NAChannelMap::new(), mode } @@ -55,9 +61,12 @@ impl PCMDecoder { } } +#[cfg(feature="decoder_pcm")] const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C]; +#[cfg(feature="decoder_pcm")] const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R]; +#[cfg(feature="decoder_pcm")] fn get_default_chmap(nch: u8) -> NAChannelMap { let mut chmap = NAChannelMap::new(); match nch { @@ -68,6 +77,7 @@ fn get_default_chmap(nch: u8) -> NAChannelMap { chmap } +#[cfg(feature="decoder_pcm")] fn get_duration(ainfo: &NAAudioInfo, duration: Option, data_size: usize) -> u64 { if duration == None { let size_bits = (data_size as u64) * 8; @@ -78,6 +88,7 @@ fn get_duration(ainfo: &NAAudioInfo, duration: Option, data_size: usize) -> } } +#[cfg(feature="decoder_pcm")] impl NADecoder for PCMDecoder { fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { @@ -109,29 +120,35 @@ impl NADecoder for PCMDecoder { } } +#[cfg(feature="decoder_pcm")] impl NAOptionHandler for PCMDecoder { fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } fn set_options(&mut self, _options: &[NAOption]) { } fn query_option_value(&self, _name: &str) -> Option { None } } +#[cfg(feature="decoder_pcm")] pub fn get_decoder() -> Box { Box::new(PCMDecoder::new(PCMMode::Infinity)) } +#[cfg(feature="decoder_pcm")] pub fn get_a_law_decoder() -> Box { Box::new(PCMDecoder::new(PCMMode::ALaw)) } +#[cfg(feature="decoder_pcm")] pub fn get_mu_law_decoder() -> Box { Box::new(PCMDecoder::new(PCMMode::MuLaw)) } +#[cfg(feature="encoder_pcm")] struct PCMEncoder { stream: Option, pkt: Option, } +#[cfg(feature="encoder_pcm")] impl PCMEncoder { fn new() -> Self { PCMEncoder { @@ -141,6 +158,7 @@ impl PCMEncoder { } } +#[allow(unused_macros)] macro_rules! write_buffer { ($abuf: expr, $dvec: expr, $write_be: ident, $write_le: ident, $dtype: tt) => { let info = $abuf.get_info(); @@ -166,6 +184,7 @@ macro_rules! write_buffer { } } +#[cfg(feature="encoder_pcm")] impl NAEncoder for PCMEncoder { fn negotiate_format(&self, encinfo: &EncodeParameters) -> EncoderResult { match encinfo.format { @@ -246,12 +265,14 @@ impl NAEncoder for PCMEncoder { } } +#[cfg(feature="encoder_pcm")] impl NAOptionHandler for PCMEncoder { fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } fn set_options(&mut self, _options: &[NAOption]) { } fn query_option_value(&self, _name: &str) -> Option { None } } +#[cfg(feature="encoder_pcm")] pub fn get_encoder() -> Box { Box::new(PCMEncoder::new()) } diff --git a/nihav-game/src/codecs/futurevision.rs b/nihav-game/src/codecs/futurevision.rs index c59e9bb..8140391 100644 --- a/nihav-game/src/codecs/futurevision.rs +++ b/nihav-game/src/codecs/futurevision.rs @@ -1,10 +1,14 @@ use nihav_core::frame::*; use nihav_core::formats; +#[cfg(feature="decoder_fstaud")] use nihav_core::formats::NAChannelMap; use nihav_core::codecs::*; +#[cfg(feature="decoder_fstvid")] use nihav_core::io::byteio::*; +#[cfg(feature="decoder_fstaud")] use nihav_codec_support::codecs::imaadpcm::IMAState; +#[cfg(feature="decoder_fstvid")] struct FutureVisionVideoDecoder { info: NACodecInfoRef, pal: [u8; 768], @@ -13,6 +17,7 @@ struct FutureVisionVideoDecoder { h: usize, } +#[cfg(feature="decoder_fstvid")] struct Bits8<'a> { src: &'a [u8], pos: usize, @@ -20,6 +25,7 @@ struct Bits8<'a> { bit: u8, } +#[cfg(feature="decoder_fstvid")] impl<'a> Bits8<'a> { fn new(src: &'a [u8]) -> Self { Bits8 { src, pos: 0, buf: 0, bit: 0 } } fn read_bit(&mut self) -> ByteIOResult { @@ -39,6 +45,7 @@ impl<'a> Bits8<'a> { } } +#[cfg(feature="decoder_fstvid")] impl FutureVisionVideoDecoder { fn new() -> Self { FutureVisionVideoDecoder { @@ -65,6 +72,7 @@ impl FutureVisionVideoDecoder { } } +#[cfg(feature="decoder_fstvid")] impl NADecoder for FutureVisionVideoDecoder { fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { @@ -143,16 +151,19 @@ impl NADecoder for FutureVisionVideoDecoder { } } +#[cfg(feature="decoder_fstvid")] impl NAOptionHandler for FutureVisionVideoDecoder { fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } fn set_options(&mut self, _options: &[NAOption]) { } fn query_option_value(&self, _name: &str) -> Option { None } } +#[cfg(feature="decoder_fstvid")] pub fn get_decoder_video() -> Box { Box::new(FutureVisionVideoDecoder::new()) } +#[cfg(feature="decoder_fstaud")] struct FutureVisionAudioDecoder { ainfo: NAAudioInfo, chmap: NAChannelMap, @@ -160,6 +171,7 @@ struct FutureVisionAudioDecoder { count: usize, } +#[cfg(feature="decoder_fstaud")] impl FutureVisionAudioDecoder { fn new() -> Self { FutureVisionAudioDecoder { @@ -171,6 +183,7 @@ impl FutureVisionAudioDecoder { } } +#[cfg(feature="decoder_fstaud")] impl NADecoder for FutureVisionAudioDecoder { fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { @@ -209,12 +222,14 @@ impl NADecoder for FutureVisionAudioDecoder { } } +#[cfg(feature="decoder_fstaud")] impl NAOptionHandler for FutureVisionAudioDecoder { fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } fn set_options(&mut self, _options: &[NAOption]) { } fn query_option_value(&self, _name: &str) -> Option { None } } +#[cfg(feature="decoder_fstaud")] pub fn get_decoder_audio() -> Box { Box::new(FutureVisionAudioDecoder::new()) } diff --git a/nihav-game/src/codecs/mod.rs b/nihav-game/src/codecs/mod.rs index 8e735f2..f5e9532 100644 --- a/nihav-game/src/codecs/mod.rs +++ b/nihav-game/src/codecs/mod.rs @@ -1,5 +1,6 @@ use nihav_core::codecs::*; +#[allow(unused_macros)] macro_rules! validate { ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DecoderError::InvalidData); } }; } diff --git a/nihav-ms/src/codecs/msadpcm.rs b/nihav-ms/src/codecs/msadpcm.rs index a63f4e5..068dd41 100644 --- a/nihav-ms/src/codecs/msadpcm.rs +++ b/nihav-ms/src/codecs/msadpcm.rs @@ -37,6 +37,7 @@ impl Predictor { } } +#[cfg(feature="decoder_ms_adpcm")] struct MSADPCMDecoder { ainfo: NAAudioInfo, chmap: NAChannelMap, @@ -45,6 +46,7 @@ struct MSADPCMDecoder { block_samps: usize, } +#[cfg(feature="decoder_ms_adpcm")] impl MSADPCMDecoder { fn new() -> Self { Self { @@ -57,6 +59,7 @@ impl MSADPCMDecoder { } } +#[cfg(feature="decoder_ms_adpcm")] impl NADecoder for MSADPCMDecoder { #[allow(clippy::int_plus_one)] fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { @@ -162,17 +165,20 @@ impl NADecoder for MSADPCMDecoder { } } +#[cfg(feature="decoder_ms_adpcm")] impl NAOptionHandler for MSADPCMDecoder { fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } fn set_options(&mut self, _options: &[NAOption]) { } fn query_option_value(&self, _name: &str) -> Option { None } } +#[cfg(feature="decoder_ms_adpcm")] pub fn get_decoder() -> Box { Box::new(MSADPCMDecoder::new()) } #[derive(Default)] +#[cfg(feature="encoder_ms_adpcm")] struct MSADPCMEncoder { stream: Option, samples: Vec, @@ -182,8 +188,10 @@ struct MSADPCMEncoder { srate: u32, } +#[cfg(feature="encoder_ms_adpcm")] const DEFAULT_BLOCK_LEN: usize = 256; +#[cfg(feature="encoder_ms_adpcm")] impl MSADPCMEncoder { fn new() -> Self { Self::default() } fn encode_packet(&mut self) -> EncoderResult { @@ -297,6 +305,7 @@ impl MSADPCMEncoder { } } +#[cfg(feature="encoder_ms_adpcm")] impl NAEncoder for MSADPCMEncoder { fn negotiate_format(&self, encinfo: &EncodeParameters) -> EncoderResult { match encinfo.format { @@ -394,12 +403,14 @@ impl NAEncoder for MSADPCMEncoder { } } +#[cfg(feature="encoder_ms_adpcm")] impl NAOptionHandler for MSADPCMEncoder { fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } fn set_options(&mut self, _options: &[NAOption]) { } fn query_option_value(&self, _name: &str) -> Option { None } } +#[cfg(feature="encoder_ms_adpcm")] pub fn get_encoder() -> Box { Box::new(MSADPCMEncoder::new()) } -- 2.30.2