aboutsummaryrefslogtreecommitdiffstats
path: root/nihav-core/src
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2019-01-17 15:14:02 +0100
committerKostya Shishkov <kostya.shishkov@gmail.com>2019-01-17 16:17:26 +0100
commit38953fb529efad1b0b609eec77f7839e62ad2719 (patch)
treeff078f5cf18aed19bf0e3f8fa620695744e5ed3d /nihav-core/src
parentce64639a7a453c797519d5bdb64b5424bde59262 (diff)
downloadnihav-38953fb529efad1b0b609eec77f7839e62ad2719.tar.gz
split remaining decoders and demuxer from core
Diffstat (limited to 'nihav-core/src')
-rw-r--r--nihav-core/src/codecs/aac.rs1768
-rw-r--r--nihav-core/src/codecs/atrac3.rs765
-rw-r--r--nihav-core/src/codecs/clearvideo.rs2570
-rw-r--r--nihav-core/src/codecs/mod.rs39
-rw-r--r--nihav-core/src/codecs/pcm.rs65
-rw-r--r--nihav-core/src/codecs/sipro.rs1584
-rw-r--r--nihav-core/src/codecs/ts102366.rs1534
-rw-r--r--nihav-core/src/demuxers/avi.rs421
-rw-r--r--nihav-core/src/demuxers/mod.rs17
9 files changed, 1 insertions, 8762 deletions
diff --git a/nihav-core/src/codecs/aac.rs b/nihav-core/src/codecs/aac.rs
deleted file mode 100644
index 23d6689..0000000
--- a/nihav-core/src/codecs/aac.rs
+++ /dev/null
@@ -1,1768 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use crate::codecs::*;
-use crate::dsp::fft::FFTMode;
-use crate::dsp::mdct::IMDCT;
-use crate::dsp::window::*;
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use std::fmt;
-use crate::io::intcode::*;
-use std::mem;
-use std::ptr;
-use std::str::FromStr;
-use std::f32::consts;
-
-#[allow(non_camel_case_types)]
-#[derive(Clone,Copy,PartialEq)]
-enum M4AType {
- None,
- Main,
- LC,
- SSR,
- LTP,
- SBR,
- Scalable,
- TwinVQ,
- CELP,
- HVXC,
- TTSI,
- MainSynth,
- WavetableSynth,
- GeneralMIDI,
- Algorithmic,
- ER_AAC_LC,
- ER_AAC_LTP,
- ER_AAC_Scalable,
- ER_TwinVQ,
- ER_BSAC,
- ER_AAC_LD,
- ER_CELP,
- ER_HVXC,
- ER_HILN,
- ER_Parametric,
- SSC,
- PS,
- MPEGSurround,
- Layer1,
- Layer2,
- Layer3,
- DST,
- ALS,
- SLS,
- SLSNonCore,
- ER_AAC_ELD,
- SMRSimple,
- SMRMain,
- Reserved,
- Unknown,
-}
-
-const M4A_TYPES: &[M4AType] = &[
- M4AType::None, M4AType::Main, M4AType::LC, M4AType::SSR,
- M4AType::LTP, M4AType::SBR, M4AType::Scalable, M4AType::TwinVQ,
- M4AType::CELP, M4AType::HVXC, M4AType::Reserved, M4AType::Reserved,
- M4AType::TTSI, M4AType::MainSynth, M4AType::WavetableSynth, M4AType::GeneralMIDI,
- M4AType::Algorithmic, M4AType::ER_AAC_LC, M4AType::Reserved, M4AType::ER_AAC_LTP,
- M4AType::ER_AAC_Scalable, M4AType::ER_TwinVQ, M4AType::ER_BSAC, M4AType::ER_AAC_LD,
- M4AType::ER_CELP, M4AType::ER_HVXC, M4AType::ER_HILN, M4AType::ER_Parametric,
- M4AType::SSC, M4AType::PS, M4AType::MPEGSurround, M4AType::Reserved /*escape*/,
- M4AType::Layer1, M4AType::Layer2, M4AType::Layer3, M4AType::DST,
- M4AType::ALS, M4AType::SLS, M4AType::SLSNonCore, M4AType::ER_AAC_ELD,
- M4AType::SMRSimple, M4AType::SMRMain,
-];
-const M4A_TYPE_NAMES: &[&str] = &[
- "None", "AAC Main", "AAC LC", "AAC SSR", "AAC LTP", "SBR", "AAC Scalable", "TwinVQ", "CELP", "HVXC",
- /*"(reserved10)", "(reserved11)", */ "TTSI",
- "Main synthetic", "Wavetable synthesis", "General MIDI", "Algorithmic Synthesis and Audio FX",
- "ER AAC LC", /*"(reserved18)",*/ "ER AAC LTP", "ER AAC Scalable", "ER TwinVQ", "ER BSAC", "ER AAC LD",
- "ER CELP", "ER HVXC", "ER HILN", "ER Parametric", "SSC", "PS", "MPEG Surround", /*"(escape)",*/
- "Layer-1", "Layer-2", "Layer-3", "DST", "ALS", "SLS", "SLS non-core", "ER AAC ELD", "SMR Simple", "SMR Main",
- "(reserved)", "(unknown)",
-];
-
-impl fmt::Display for M4AType {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{}", M4A_TYPE_NAMES[*self as usize])
- }
-}
-
-const AAC_SAMPLE_RATES: [u32; 16] = [
- 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
- 16000, 12000, 11025, 8000, 7350, 0, 0, 0
-];
-
-const AAC_CHANNELS: [usize; 8] = [ 0, 1, 2, 3, 4, 5, 6, 8 ];
-
-struct M4AInfo {
- otype: M4AType,
- srate: u32,
- channels: usize,
- samples: usize,
- sbr_ps_info: Option<(u32, usize)>,
- sbr_present: bool,
- ps_present: bool,
-}
-
-impl M4AInfo {
- fn new() -> Self {
- Self {
- otype: M4AType::None,
- srate: 0,
- channels: 0,
- samples: 0,
- sbr_ps_info: Option::None,
- sbr_present: false,
- ps_present: false,
- }
- }
- fn read_object_type(br: &mut BitReader) -> DecoderResult<M4AType> {
- let otypeidx;
- if br.peek(5) == 31 {
- br.skip(5)?;
- otypeidx = (br.read(6)? as usize) + 32;
- } else {
- otypeidx = br.read(5)? as usize;
- }
- if otypeidx >= M4A_TYPES.len() {
- Ok(M4AType::Unknown)
- } else {
- Ok(M4A_TYPES[otypeidx])
- }
- }
- fn read_sampling_frequency(br: &mut BitReader) -> DecoderResult<u32> {
- if br.peek(4) == 15 {
- let srate = br.read(24)?;
- Ok(srate)
- } else {
- let srate_idx = br.read(4)? as usize;
- Ok(AAC_SAMPLE_RATES[srate_idx])
- }
- }
- fn read_channel_config(br: &mut BitReader) -> DecoderResult<usize> {
- let chidx = br.read(4)? as usize;
- if chidx < AAC_CHANNELS.len() {
- Ok(AAC_CHANNELS[chidx])
- } else {
- Ok(chidx)
- }
- }
- fn read(&mut self, src: &[u8]) -> DecoderResult<()> {
- let mut br = BitReader::new(src, src.len(), BitReaderMode::BE);
- self.otype = Self::read_object_type(&mut br)?;
- self.srate = Self::read_sampling_frequency(&mut br)?;
- validate!(self.srate > 0);
- self.channels = Self::read_channel_config(&mut br)?;
-
- if (self.otype == M4AType::SBR) || (self.otype == M4AType::PS) {
- let ext_srate = Self::read_sampling_frequency(&mut br)?;
- self.otype = Self::read_object_type(&mut br)?;
- let ext_chans;
- if self.otype == M4AType::ER_BSAC {
- ext_chans = Self::read_channel_config(&mut br)?;
- } else {
- ext_chans = 0;
- }
- self.sbr_ps_info = Some((ext_srate, ext_chans));
- }
-
- match self.otype {
- M4AType::Main | M4AType::LC | M4AType::SSR | M4AType::Scalable | M4AType::TwinVQ |
- M4AType::ER_AAC_LC | M4AType::ER_AAC_LTP | M4AType::ER_AAC_Scalable | M4AType::ER_TwinVQ |
- M4AType::ER_BSAC | M4AType::ER_AAC_LD => {
- // GASpecificConfig
- let short_frame = br.read_bool()?;
- self.samples = if short_frame { 960 } else { 1024 };
- let depends_on_core = br.read_bool()?;
- if depends_on_core {
- let _delay = br.read(14)?;
- }
- let extension_flag = br.read_bool()?;
- if self.channels == 0 {
- unimplemented!("program config element");
- }
- if (self.otype == M4AType::Scalable) || (self.otype == M4AType::ER_AAC_Scalable) {
- let _layer = br.read(3)?;
- }
- if extension_flag {
- if self.otype == M4AType::ER_BSAC {
- let _num_subframes = br.read(5)? as usize;
- let _layer_length = br.read(11)?;
- }
- if (self.otype == M4AType::ER_AAC_LC) ||
- (self.otype == M4AType::ER_AAC_LTP) ||
- (self.otype == M4AType::ER_AAC_Scalable) ||
- (self.otype == M4AType::ER_AAC_LD) {
- let _section_data_resilience = br.read_bool()?;
- let _scalefactors_resilience = br.read_bool()?;
- let _spectral_data_resilience = br.read_bool()?;
- }
- let extension_flag3 = br.read_bool()?;
- if extension_flag3 {
- unimplemented!("version3 extensions");
- }
- }
- },
- M4AType::CELP => { unimplemented!("CELP config"); },
- M4AType::HVXC => { unimplemented!("HVXC config"); },
- M4AType::TTSI => { unimplemented!("TTS config"); },
- M4AType::MainSynth | M4AType::WavetableSynth | M4AType::GeneralMIDI | M4AType::Algorithmic => { unimplemented!("structured audio config"); },
- M4AType::ER_CELP => { unimplemented!("ER CELP config"); },
- M4AType::ER_HVXC => { unimplemented!("ER HVXC config"); },
- M4AType::ER_HILN | M4AType::ER_Parametric => { unimplemented!("parametric config"); },
- M4AType::SSC => { unimplemented!("SSC config"); },
- M4AType::MPEGSurround => {
- br.skip(1)?; // sacPayloadEmbedding
- unimplemented!("MPEG Surround config");
- },
- M4AType::Layer1 | M4AType::Layer2 | M4AType::Layer3 => { unimplemented!("MPEG Layer 1/2/3 config"); },
- M4AType::DST => { unimplemented!("DST config"); },
- M4AType::ALS => {
- br.skip(5)?; // fillBits
- unimplemented!("ALS config");
- },
- M4AType::SLS | M4AType::SLSNonCore => { unimplemented!("SLS config"); },
- M4AType::ER_AAC_ELD => { unimplemented!("ELD config"); },
- M4AType::SMRSimple | M4AType::SMRMain => { unimplemented!("symbolic music config"); },
- _ => {},
- };
- match self.otype {
- M4AType::ER_AAC_LC | M4AType::ER_AAC_LTP | M4AType::ER_AAC_Scalable | M4AType::ER_TwinVQ |
- M4AType::ER_BSAC | M4AType::ER_AAC_LD | M4AType::ER_CELP | M4AType::ER_HVXC |
- M4AType::ER_HILN | M4AType::ER_Parametric | M4AType::ER_AAC_ELD => {
- let ep_config = br.read(2)?;
- if (ep_config == 2) || (ep_config == 3) {
- unimplemented!("error protection config");
- }
- if ep_config == 3 {
- let direct_mapping = br.read_bool()?;
- validate!(direct_mapping);
- }
- },
- _ => {},
- };
- if self.sbr_ps_info.is_some() && (br.left() >= 16) {
- let sync = br.read(11)?;
- if sync == 0x2B7 {
- let ext_otype = Self::read_object_type(&mut br)?;
- if ext_otype == M4AType::SBR {
- self.sbr_present = br.read_bool()?;
- if self.sbr_present {
- let _ext_srate = Self::read_sampling_frequency(&mut br)?;
- if br.left() >= 12 {
- let sync = br.read(11)?;
- if sync == 0x548 {
- self.ps_present = br.read_bool()?;
- }
- }
- }
- }
- if ext_otype == M4AType::PS {
- self.sbr_present = br.read_bool()?;
- if self.sbr_present {
- let _ext_srate = Self::read_sampling_frequency(&mut br)?;
- }
- let _ext_channels = br.read(4)?;
- }
- }
- }
-
- Ok(())
- }
-}
-
-impl fmt::Display for M4AInfo {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "MPEG 4 Audio {}, {} Hz, {} channels, {} samples per frame",
- self.otype, self.srate, self.channels, self.samples)
- }
-}
-
-const MAX_WINDOWS: usize = 8;
-const MAX_SFBS: usize = 64;
-
-#[derive(Clone,Copy)]
-struct ICSInfo {
- window_sequence: u8,
- prev_window_sequence: u8,
- window_shape: bool,
- prev_window_shape: bool,
- scale_factor_grouping: [bool; MAX_WINDOWS],
- group_start: [usize; MAX_WINDOWS],
- window_groups: usize,
- num_windows: usize,
- max_sfb: usize,
- predictor_data: Option<LTPData>,
- long_win: bool,
-}
-
-const ONLY_LONG_SEQUENCE: u8 = 0;
-const LONG_START_SEQUENCE: u8 = 1;
-const EIGHT_SHORT_SEQUENCE: u8 = 2;
-const LONG_STOP_SEQUENCE: u8 = 3;
-
-impl ICSInfo {
- fn new() -> Self {
- Self {
- window_sequence: 0,
- prev_window_sequence: 0,
- window_shape: false,
- prev_window_shape: false,
- scale_factor_grouping: [false; MAX_WINDOWS],
- group_start: [0; MAX_WINDOWS],
- num_windows: 0,
- window_groups: 0,
- max_sfb: 0,
- predictor_data: None,
- long_win: true,
- }
- }
- fn decode_ics_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- self.prev_window_sequence = self.window_sequence;
- self.prev_window_shape = self.window_shape;
- let ics_reserved_bit = br.read(1)?;
- validate!(ics_reserved_bit == 0);
- self.window_sequence = br.read(2)? as u8;
- match self.prev_window_sequence {
- ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => {
- validate!((self.window_sequence == ONLY_LONG_SEQUENCE) ||
- (self.window_sequence == LONG_START_SEQUENCE));
- },
- LONG_START_SEQUENCE | EIGHT_SHORT_SEQUENCE => {
- validate!((self.window_sequence == EIGHT_SHORT_SEQUENCE) ||
- (self.window_sequence == LONG_STOP_SEQUENCE));
- },
- _ => {},
- };
- self.window_shape = br.read_bool()?;
- self.window_groups = 1;
- if self.window_sequence == EIGHT_SHORT_SEQUENCE {
- self.long_win = false;
- self.num_windows = 8;
- self.max_sfb = br.read(4)? as usize;
- for i in 0..MAX_WINDOWS-1 {
- self.scale_factor_grouping[i] = br.read_bool()?;
- if !self.scale_factor_grouping[i] {
- self.group_start[self.window_groups] = i + 1;
- self.window_groups += 1;
- }
- }
- } else {
- self.long_win = true;
- self.num_windows = 1;
- self.max_sfb = br.read(6)? as usize;
- self.predictor_data = LTPData::read(br)?;
- }
- Ok(())
- }
- fn get_group_start(&self, g: usize) -> usize {
- if g == 0 {
- 0
- } else if g >= self.window_groups {
- if self.long_win { 1 } else { 8 }
- } else {
- self.group_start[g]
- }
- }
-}
-
-#[derive(Clone,Copy)]
-struct LTPData {
-}
-
-impl LTPData {
- fn read(br: &mut BitReader) -> DecoderResult<Option<Self>> {
- let predictor_data_present = br.read_bool()?;
- if !predictor_data_present { return Ok(None); }
-unimplemented!("predictor data");
-/*
- if is_main {
- let predictor_reset = br.read_bool()?;
- if predictor_reset {
- let predictor_reset_group_number = br.read(5)?;
- }
- for sfb in 0..max_sfb.min(PRED_SFB_MAX) {
- prediction_used[sfb] = br.read_bool()?;
- }
- } else {
- let ltp_data_present = br.read_bool()?;
- if ltp_data_present {
- //ltp data
- }
- if common_window {
- let ltp_data_present = br.read_bool()?;
- if ltp_data_present {
- //ltp data
- }
- }
- }
- Ok(Some(Self { }))
-*/
- }
-}
-
-#[derive(Clone,Copy)]
-#[allow(dead_code)]
-struct PulseData {
- number_pulse: usize,
- pulse_start_sfb: usize,
- pulse_offset: [u8; 4],
- pulse_amp: [u8; 4],
-}
-
-impl PulseData {
- fn read(br: &mut BitReader) -> DecoderResult<Option<Self>> {
- let pulse_data_present = br.read_bool()?;
- if !pulse_data_present { return Ok(None); }
-
- let number_pulse = (br.read(2)? as usize) + 1;
- let pulse_start_sfb = br.read(6)? as usize;
- let mut pulse_offset: [u8; 4] = [0; 4];
- let mut pulse_amp: [u8; 4] = [0; 4];
- for i in 0..number_pulse {
- pulse_offset[i] = br.read(5)? as u8;
- pulse_amp[i] = br.read(4)? as u8;
- }
- Ok(Some(Self{ number_pulse, pulse_start_sfb, pulse_offset, pulse_amp }))
- }
-}
-
-const TNS_MAX_ORDER: usize = 20;
-const TNS_MAX_LONG_BANDS: [usize; 12] = [ 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 ];
-const TNS_MAX_SHORT_BANDS: [usize; 12] = [ 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14 ];
-
-#[derive(Clone,Copy)]
-struct TNSCoeffs {
- length: usize,
- order: usize,
- direction: bool,
- compress: bool,
- coef: [f32; TNS_MAX_ORDER + 1],
-}
-
-impl TNSCoeffs {
- fn new() -> Self {
- Self {
- length: 0, order: 0, direction: false, compress: false, coef: [0.0; TNS_MAX_ORDER + 1],
- }
- }
- fn read(&mut self, br: &mut BitReader, long_win: bool, coef_res: bool, max_order: usize) -> DecoderResult<()> {
- self.length = br.read(if long_win { 6 } else { 4 })? as usize;
- self.order = br.read(if long_win { 5 } else { 3 })? as usize;
- validate!(self.order <= max_order);
- if self.order > 0 {
- self.direction = br.read_bool()?;
- self.compress = br.read_bool()?;
- let mut coef_bits = 3;
- if coef_res { coef_bits += 1; }
- if self.compress { coef_bits -= 1; }
- let sign_mask = 1 << (coef_bits - 1);
- let neg_mask = !(sign_mask * 2 - 1);
-
- let fac_base = if coef_res { 1 << 3 } else { 1 << 2 } as f32;
- let iqfac = (fac_base - 0.5) / (consts::PI / 2.0);
- let iqfac_m = (fac_base + 0.5) / (consts::PI / 2.0);
- let mut tmp: [f32; TNS_MAX_ORDER] = [0.0; TNS_MAX_ORDER];
- for i in 0..self.order {
- let val = br.read(coef_bits)? as i8;
- let c = if (val & sign_mask) != 0 { val | neg_mask } else { val } as f32;
- tmp[i] = (if c >= 0.0 { c / iqfac } else { c / iqfac_m }).sin();
- }
- // convert to LPC coefficients
- let mut b: [f32; TNS_MAX_ORDER + 1] = [0.0; TNS_MAX_ORDER + 1];
- for m in 1..(self.order + 1) {
- for i in 1..m {
- b[i] = self.coef[i - 1] + tmp[m - 1] * self.coef[m - i - 1];
- }
- for i in 1..m {
- self.coef[i - 1] = b[i];
- }
- self.coef[m - 1] = tmp[m - 1];
- }
- }
- Ok(())
- }
-}
-
-#[derive(Clone,Copy)]
-#[allow(dead_code)]
-struct TNSData {
- n_filt: [usize; MAX_WINDOWS],
- coef_res: [bool; MAX_WINDOWS],
- coeffs: [[TNSCoeffs; 4]; MAX_WINDOWS],
-}
-
-impl TNSData {
- fn read(br: &mut BitReader, long_win: bool, num_windows: usize, max_order: usize) -> DecoderResult<Option<Self>> {
- let tns_data_present = br.read_bool()?;
- if !tns_data_present { return Ok(None); }
- let mut n_filt: [usize; MAX_WINDOWS] = [0; MAX_WINDOWS];
- let mut coef_res: [bool; MAX_WINDOWS] = [false; MAX_WINDOWS];
- let mut coeffs: [[TNSCoeffs; 4]; MAX_WINDOWS] = [[TNSCoeffs::new(); 4]; MAX_WINDOWS];
- for w in 0..num_windows {
- n_filt[w] = br.read(if long_win { 2 } else { 1 })? as usize;
- if n_filt[w] != 0 {
- coef_res[w] = br.read_bool()?;
- }
- for filt in 0..n_filt[w] {
- coeffs[w][filt].read(br, long_win, coef_res[w], max_order)?;
- }
- }
- Ok(Some(Self { n_filt, coef_res, coeffs }))
- }
-}
-
-#[derive(Clone,Copy)]
-#[allow(dead_code)]
-struct GainControlData {
- max_band: u8,
-}
-
-impl GainControlData {
- fn read(br: &mut BitReader) -> DecoderResult<Option<Self>> {
- let gain_control_data_present = br.read_bool()?;
- if !gain_control_data_present { return Ok(None); }
-unimplemented!("gain control data");
-/* self.max_band = br.read(2)? as u8;
- if window_sequence == ONLY_LONG_SEQUENCE {
- for bd in 0..max_band
-...
- }
- Ok(Some(Self { }))*/
- }
-}
-
-const ZERO_HCB: u8 = 0;
-const FIRST_PAIR_HCB: u8 = 5;
-const ESC_HCB: u8 = 11;
-const RESERVED_HCB: u8 = 12;
-const NOISE_HCB: u8 = 13;
-const INTENSITY_HCB2: u8 = 14;
-const INTENSITY_HCB: u8 = 15;
-
-struct Codebooks {
- scale_cb: Codebook<i8>,
- spec_cb: [Codebook<u16>; 11],
-}
-
-fn scale_map(idx: usize) -> i8 { (idx as i8) - 60 }
-fn cb_map(idx: usize) -> u16 { idx as u16 }
-
-impl Codebooks {
- fn new() -> Self {
- let mut coderead = TableCodebookDescReader::new(AAC_SCF_CODEBOOK_CODES, AAC_SCF_CODEBOOK_BITS, scale_map);
- let scale_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut spec_cb: [Codebook<u16>; 11];
- unsafe {
- spec_cb = mem::uninitialized();
- for i in 0..AAC_SPEC_CODES.len() {
- let mut coderead = TableCodebookDescReader::new(AAC_SPEC_CODES[i], AAC_SPEC_BITS[i], cb_map);
- ptr::write(&mut spec_cb[i], Codebook::new(&mut coderead, CodebookMode::MSB).unwrap());
- }
- }
- Self { scale_cb, spec_cb }
- }
-}
-
-#[derive(Clone)]
-struct ICS {
- global_gain: u8,
- info: ICSInfo,
- pulse_data: Option<PulseData>,
- tns_data: Option<TNSData>,
- gain_control: Option<GainControlData>,
- sect_cb: [[u8; MAX_SFBS]; MAX_WINDOWS],
- sect_len: [[usize; MAX_SFBS]; MAX_WINDOWS],
- sfb_cb: [[u8; MAX_SFBS]; MAX_WINDOWS],
- num_sec: [usize; MAX_WINDOWS],
- scales: [[u8; MAX_SFBS]; MAX_WINDOWS],
- sbinfo: GASubbandInfo,
- coeffs: [f32; 1024],
- delay: [f32; 1024],
-}
-
-const INTENSITY_SCALE_MIN: i16 = -155;
-const NOISE_SCALE_MIN: i16 = -100;
-impl ICS {
- fn new(sbinfo: GASubbandInfo) -> Self {
- Self {
- global_gain: 0,
- info: ICSInfo::new(),
- pulse_data: None,
- tns_data: None,
- gain_control: None,
- sect_cb: [[0; MAX_SFBS]; MAX_WINDOWS],
- sect_len: [[0; MAX_SFBS]; MAX_WINDOWS],
- sfb_cb: [[0; MAX_SFBS]; MAX_WINDOWS],
- scales: [[0; MAX_SFBS]; MAX_WINDOWS],
- num_sec: [0; MAX_WINDOWS],
- sbinfo,
- coeffs: [0.0; 1024],
- delay: [0.0; 1024],
- }
- }
- fn decode_section_data(&mut self, br: &mut BitReader, may_have_intensity: bool) -> DecoderResult<()> {
- let sect_bits = if self.info.long_win { 5 } else { 3 };
- let sect_esc_val = (1 << sect_bits) - 1;
-
- for g in 0..self.info.window_groups {
- let mut k = 0;
- let mut l = 0;
- while k < self.info.max_sfb {
- self.sect_cb[g][l] = br.read(4)? as u8;
- self.sect_len[g][l] = 0;
- validate!(self.sect_cb[g][l] != RESERVED_HCB);
- if ((self.sect_cb[g][l] == INTENSITY_HCB) || (self.sect_cb[g][l] == INTENSITY_HCB2)) && !may_have_intensity {
- return Err(DecoderError::InvalidData);
- }
- loop {
- let sect_len_incr = br.read(sect_bits)? as usize;
- self.sect_len[g][l] += sect_len_incr;
- if sect_len_incr < sect_esc_val { break; }
- }
- validate!(k + self.sect_len[g][l] <= self.info.max_sfb);
- for _ in 0..self.sect_len[g][l] {
- self.sfb_cb[g][k] = self.sect_cb[g][l];
- k += 1;
- }
- l += 1;
- }
- self.num_sec[g] = l;
- }
- Ok(())
- }
- fn is_intensity(&self, g: usize, sfb: usize) -> bool {
- (self.sfb_cb[g][sfb] == INTENSITY_HCB) || (self.sfb_cb[g][sfb] == INTENSITY_HCB2)
- }
- fn get_intensity_dir(&self, g: usize, sfb: usize) -> bool {
- self.sfb_cb[g][sfb] == INTENSITY_HCB
- }
- fn decode_scale_factor_data(&mut self, br: &mut BitReader, codebooks: &Codebooks) -> DecoderResult<()> {
- let mut noise_pcm_flag = true;
- let mut scf_normal = self.global_gain as i16;
- let mut scf_intensity = 0i16;
- let mut scf_noise = 0i16;
- for g in 0..self.info.window_groups {
- for sfb in 0..self.info.max_sfb {
- if self.sfb_cb[g][sfb] != ZERO_HCB {
- if self.is_intensity(g, sfb) {
- let diff = br.read_cb(&codebooks.scale_cb)? as i16;
- scf_intensity += diff;
- validate!((scf_intensity >= INTENSITY_SCALE_MIN) && (scf_intensity < INTENSITY_SCALE_MIN + 256));
- self.scales[g][sfb] = (scf_intensity - INTENSITY_SCALE_MIN) as u8;
- } else {
- if self.sfb_cb[g][sfb] == NOISE_HCB {
- if noise_pcm_flag {
- noise_pcm_flag = false;
- scf_noise = (br.read(9)? as i16) - 256 + (self.global_gain as i16) - 90;
- } else {
- scf_noise += br.read_cb(&codebooks.scale_cb)? as i16;
- }
- validate!((scf_noise >= NOISE_SCALE_MIN) && (scf_noise < NOISE_SCALE_MIN + 256));
- self.scales[g][sfb] = (scf_noise - NOISE_SCALE_MIN) as u8;
- } else {
- scf_normal += br.read_cb(&codebooks.scale_cb)? as i16;
- validate!((scf_normal >= 0) && (scf_normal < 255));
- self.scales[g][sfb] = scf_normal as u8;
- }
- }
- }
- }
- }
- Ok(())
- }
- fn get_band_start(&self, swb: usize) -> usize {
- if self.info.long_win {
- self.sbinfo.long_bands[swb]
- } else {
- self.sbinfo.short_bands[swb]
- }
- }
- fn get_num_bands(&self) -> usize {
- if self.info.long_win {
- self.sbinfo.long_bands.len() - 1
- } else {
- self.sbinfo.short_bands.len() - 1
- }
- }
- fn decode_spectrum(&mut self, br: &mut BitReader, codebooks: &Codebooks) -> DecoderResult<()> {
- self.coeffs = [0.0; 1024];
- for g in 0..self.info.window_groups {
- let cur_w = self.info.get_group_start(g);
- let next_w = self.info.get_group_start(g + 1);
- for sfb in 0..self.info.max_sfb {
- let start = self.get_band_start(sfb);
- let end = self.get_band_start(sfb + 1);
- let cb_idx = self.sfb_cb[g][sfb];
- for w in cur_w..next_w {
- let dst = &mut self.coeffs[start + w*128..end + w*128];
- match cb_idx {
- ZERO_HCB => { /* zeroes */ },
- NOISE_HCB => { /* noise */ },
- INTENSITY_HCB | INTENSITY_HCB2 => { /* intensity */ },
- _ => {
- let unsigned = AAC_UNSIGNED_CODEBOOK[(cb_idx - 1) as usize];
- let scale = get_scale(self.scales[g][sfb]);
- let cb = &codebooks.spec_cb[(cb_idx - 1) as usize];
- if cb_idx < FIRST_PAIR_HCB {
- decode_quads(br, cb, unsigned, scale, dst)?;
- } else {
- decode_pairs(br, cb, unsigned, cb_idx == ESC_HCB,
- AAC_CODEBOOK_MODULO[(cb_idx - FIRST_PAIR_HCB) as usize], scale, dst)?;
- }
- },
- };
- }
- }
- }
- Ok(())
- }
- fn place_pulses(&mut self) {
- if let Some(ref pdata) = self.pulse_data {
- if pdata.pulse_start_sfb >= self.sbinfo.long_bands.len() - 1 { return; }
- let mut k = self.get_band_start(pdata.pulse_start_sfb);
- let mut band = pdata.pulse_start_sfb;
- for pno in 0..pdata.number_pulse {
- k += pdata.pulse_offset[pno] as usize;
- if k >= 1024 { return; }
- while self.get_band_start(band + 1) <= k { band += 1; }
- let scale = get_scale(self.scales[0][band]);
- let mut base = self.coeffs[k];
- if base != 0.0 {
- base = requant(self.coeffs[k], scale);
- }
- if base > 0.0 {
- base += pdata.pulse_amp[pno] as f32;
- } else {
- base -= pdata.pulse_amp[pno] as f32;
- }
- self.coeffs[k] = iquant(base) * scale;
- }
- }
- }
- fn decode_ics(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType, common_window: bool, may_have_intensity: bool) -> DecoderResult<()> {
- self.global_gain = br.read(8)? as u8;
- if !common_window {
- self.info.decode_ics_info(br)?;
- }
- self.decode_section_data(br, may_have_intensity)?;
- self.decode_scale_factor_data(br, codebooks)?;
- self.pulse_data = PulseData::read(br)?;
- validate!(self.pulse_data.is_none() || self.info.long_win);
- let tns_max_order;
- if !self.info.long_win {
- tns_max_order = 7;
- } else if m4atype == M4AType::LC {
- tns_max_order = 12;
- } else {
- tns_max_order = TNS_MAX_ORDER;
- }
- self.tns_data = TNSData::read(br, self.info.long_win, self.info.num_windows, tns_max_order)?;
- if m4atype == M4AType::SSR {
- self.gain_control = GainControlData::read(br)?;
- } else {
- let gain_control_data_present = br.read_bool()?;
- validate!(!gain_control_data_present);
- }
- self.decode_spectrum(br, codebooks)?;
- Ok(())
- }
- fn synth_channel(&mut self, dsp: &mut DSP, dst: &mut [f32], srate_idx: usize) {
- self.place_pulses();
- if let Some(ref tns_data) = self.tns_data {
- let tns_max_bands = (if self.info.long_win {
- TNS_MAX_LONG_BANDS[srate_idx]
- } else {
- TNS_MAX_SHORT_BANDS[srate_idx]
- }).min(self.info.max_sfb);
- for w in 0..self.info.num_windows {
- let mut bottom = self.get_num_bands();
- for f in 0..tns_data.n_filt[w] {
- let top = bottom;
- bottom = if top >= tns_data.coeffs[w][f].length { top - tns_data.coeffs[w][f].length } else { 0 };
- let order = tns_data.coeffs[w][f].order;
- if order == 0 { continue; }
- let start = w * 128 + self.get_band_start(tns_max_bands.min(bottom));
- let end = w * 128 + self.get_band_start(tns_max_bands.min(top));
- let lpc = &tns_data.coeffs[w][f].coef;
- if !tns_data.coeffs[w][f].direction {
- for m in start..end {
- for i in 0..order.min(m) {
- self.coeffs[m] -= self.coeffs[m - i - 1] * lpc[i];
- }
- }
- } else {
- for m in (start..end).rev() {
- for i in 0..order.min(m) {
- self.coeffs[m] -= self.coeffs[m + i - 1] * lpc[i];
- }
- }
- }
- }
- }
- }
- dsp.synth(&self.coeffs, &mut self.delay, self.info.window_sequence, self.info.window_shape, self.info.prev_window_shape, dst);
- }
-}
-
-fn get_scale(scale: u8) -> f32 {
- 2.0f32.powf(0.25 * ((scale as f32) - 100.0 - 56.0))
-}
-fn iquant(val: f32) -> f32 {
- if val < 0.0 {
- -((-val).powf(4.0 / 3.0))
- } else {
- val.powf(4.0 / 3.0)
- }
-}
-fn requant(val: f32, scale: f32) -> f32 {
- if scale == 0.0 { return 0.0; }
- let bval = val / scale;
- if bval >= 0.0 {
- val.powf(3.0 / 4.0)
- } else {
- -((-val).powf(3.0 / 4.0))
- }
-}
-fn decode_quads(br: &mut BitReader, cb: &Codebook<u16>, unsigned: bool, scale: f32, dst: &mut [f32]) -> DecoderResult<()> {
- for out in dst.chunks_mut(4) {
- let cw = br.read_cb(cb)? as usize;
- if unsigned {
- for i in 0..4 {
- let val = AAC_QUADS[cw][i];
- if val != 0 {
- if br.read_bool()? {
- out[i] = iquant(-val as f32) * scale;
- } else {
- out[i] = iquant( val as f32) * scale;
- }
- }
- }
- } else {
- for i in 0..4 {
- out[i] = iquant((AAC_QUADS[cw][i] - 1) as f32) * scale;
- }
- }
- }
- Ok(())
-}
-fn decode_pairs(br: &mut BitReader, cb: &Codebook<u16>, unsigned: bool, escape: bool, modulo: u16, scale: f32, dst: &mut [f32]) -> DecoderResult<()> {
- for out in dst.chunks_mut(2) {
- let cw = br.read_cb(cb)?;
- let mut x = (cw / modulo) as i16;
- let mut y = (cw % modulo) as i16;
- if unsigned {
- if x != 0 && br.read_bool()? {
- x = -x;
- }
- if y != 0 && br.read_bool()? {
- y = -y;
- }
- } else {
- x -= (modulo >> 1) as i16;
- y -= (modulo >> 1) as i16;
- }
- if escape {
- if (x == 16) || (x == -16) {
- x += read_escape(br, x > 0)?;
- }
- if (y == 16) || (y == -16) {
- y += read_escape(br, y > 0)?;
- }
- }
- out[0] = iquant(x as f32) * scale;
- out[1] = iquant(y as f32) * scale;
- }
- Ok(())
-}
-fn read_escape(br: &mut BitReader, sign: bool) -> DecoderResult<i16> {
- let prefix = br.read_code(UintCodeType::UnaryOnes)? as u8;
- validate!(prefix < 9);
- let bits = br.read(prefix + 4)? as i16;
- if sign {
- Ok(bits)
- } else {
- Ok(-bits)
- }
-}
-
-#[derive(Clone)]
-struct ChannelPair {
- pair: bool,
- channel: usize,
- common_window: bool,
- ms_mask_present: u8,
- ms_used: [[bool; MAX_SFBS]; MAX_WINDOWS],
- ics: [ICS; 2],
-}
-
-impl ChannelPair {
- fn new(pair: bool, channel: usize, sbinfo: GASubbandInfo) -> Self {
- Self {
- pair, channel,
- common_window: false,
- ms_mask_present: 0,
- ms_used: [[false; MAX_SFBS]; MAX_WINDOWS],
- ics: [ICS::new(sbinfo), ICS::new(sbinfo)],
- }
- }
- fn decode_ga_sce(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType) -> DecoderResult<()> {
- self.ics[0].decode_ics(br, codebooks, m4atype, false, false)?;
- Ok(())
- }
- fn decode_ga_cpe(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType) -> DecoderResult<()> {
- let common_window = br.read_bool()?;
- self.common_window = common_window;
- if common_window {
- self.ics[0].info.decode_ics_info(br)?;
- self.ms_mask_present = br.read(2)? as u8;
- validate!(self.ms_mask_present != 3);
- if self.ms_mask_present == 1 {
- for g in 0..self.ics[0].info.window_groups {
- for sfb in 0..self.ics[0].info.max_sfb {
- self.ms_used[g][sfb] = br.read_bool()?;
- }
- }
- }
- self.ics[1].info = self.ics[0].info;
- }
- self.ics[0].decode_ics(br, codebooks, m4atype, common_window, true)?;
- self.ics[1].decode_ics(br, codebooks, m4atype, common_window, false)?;
- if common_window && self.ms_mask_present != 0 {
- let mut g = 0;
- for w in 0..self.ics[0].info.num_windows {
- if w > 0 && self.ics[0].info.scale_factor_grouping[w - 1] {
- g += 1;
- }
- for sfb in 0..self.ics[0].info.max_sfb {
- let start = w * 128 + self.ics[0].get_band_start(sfb);
- let end = w * 128 + self.ics[0].get_band_start(sfb + 1);
- if self.ics[0].is_intensity(g, sfb) {
- let invert = (self.ms_mask_present == 1) && self.ms_used[g][sfb];
- let dir = self.ics[0].get_intensity_dir(g, sfb) ^ invert;
- let scale = 0.5f32.powf(0.25 * ((self.ics[0].scales[g][sfb] as f32) + (INTENSITY_SCALE_MIN as f32)));
- if !dir {
- for i in start..end {
- self.ics[1].coeffs[i] = scale * self.ics[0].coeffs[i];
- }
- } else {
- for i in start..end {
- self.ics[1].coeffs[i] = -scale * self.ics[0].coeffs[i];
- }
- }
- } else if (self.ms_mask_present == 2) || self.ms_used[g][sfb] {
- for i in start..end {
- let tmp = self.ics[0].coeffs[i] - self.ics[1].coeffs[i];
- self.ics[0].coeffs[i] += self.ics[1].coeffs[i];
- self.ics[1].coeffs[i] = tmp;
- }
- }
- }
- }
- }
- Ok(())
- }
- fn synth_audio(&mut self, dsp: &mut DSP, abuf: &mut NABufferType, srate_idx: usize) {
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut output = adata.get_data_mut();
- let off0 = abuf.get_offset(self.channel);
- let off1 = abuf.get_offset(self.channel + 1);
- self.ics[0].synth_channel(dsp, &mut output[off0..], srate_idx);
- if self.pair {
- self.ics[1].synth_channel(dsp, &mut output[off1..], srate_idx);
- }
- }
-}
-
-struct DSP {
- kbd_long_win: [f32; 1024],
- kbd_short_win: [f32; 128],
- sine_long_win: [f32; 1024],
- sine_short_win: [f32; 128],
- imdct_long: IMDCT,
- imdct_short: IMDCT,
- tmp: [f32; 2048],
- ew_buf: [f32; 1152],
-}
-
-const SHORT_WIN_POINT0: usize = 512 - 64;
-const SHORT_WIN_POINT1: usize = 512 + 64;
-
-impl DSP {
- fn new() -> Self {
- let mut kbd_long_win: [f32; 1024] = [0.0; 1024];
- let mut kbd_short_win: [f32; 128] = [0.0; 128];
- generate_window(WindowType::KaiserBessel(4.0), 1.0, 1024, true, &mut kbd_long_win);
- generate_window(WindowType::KaiserBessel(6.0), 1.0, 128, true, &mut kbd_short_win);
- let mut sine_long_win: [f32; 1024] = [0.0; 1024];
- let mut sine_short_win: [f32; 128] = [0.0; 128];
- generate_window(WindowType::Sine, 1.0, 1024, true, &mut sine_long_win);
- generate_window(WindowType::Sine, 1.0, 128, true, &mut sine_short_win);
- Self {
- kbd_long_win, kbd_short_win,
- sine_long_win, sine_short_win,
- imdct_long: IMDCT::new(FFTMode::SplitRadix, 1024 * 2, true),
- imdct_short: IMDCT::new(FFTMode::SplitRadix, 128 * 2, true),
- tmp: [0.0; 2048], ew_buf: [0.0; 1152],
- }
- }
- fn synth(&mut self, coeffs: &[f32; 1024], delay: &mut [f32; 1024], seq: u8, window_shape: bool, prev_window_shape: bool, dst: &mut [f32]) {
- let long_win = if window_shape { &self.kbd_long_win } else { &self.sine_long_win };
- let short_win = if window_shape { &self.kbd_short_win } else { &self.sine_short_win };
- let left_long_win = if prev_window_shape { &self.kbd_long_win } else { &self.sine_long_win };
- let left_short_win = if prev_window_shape { &self.kbd_short_win } else { &self.sine_short_win };
- if seq != EIGHT_SHORT_SEQUENCE {
- self.imdct_long.imdct(coeffs, &mut self.tmp);
- } else {
- for (ain, aout) in coeffs.chunks(128).zip(self.tmp.chunks_mut(256)) {
- self.imdct_short.imdct(ain, aout);
- }
- self.ew_buf = [0.0; 1152];
- for (w, src) in self.tmp.chunks(256).enumerate() {
- if w > 0 {
- for i in 0..128 {
- self.ew_buf[w * 128 + i] += src[i] * short_win[i];
- }
- } else { // to be left-windowed
- for i in 0..128 {
- self.ew_buf[i] = src[i];
- }
- }
- for i in 0..128 {
- self.ew_buf[w * 128 + i + 128] += src[i + 128] * short_win[127 - i];
- }
- }
- }
- if seq == ONLY_LONG_SEQUENCE { // should be the most common case
- for i in 0..1024 {
- dst[i] = delay[i] + self.tmp[i] * left_long_win[i];
- delay[i] = self.tmp[i + 1024] * long_win[1023 - i];
- }
- return;
- }
- // output new data
- match seq {
- ONLY_LONG_SEQUENCE | LONG_START_SEQUENCE => {
- for i in 0..1024 {
- dst[i] = self.tmp[i] * left_long_win[i] + delay[i];
- }
- },
- EIGHT_SHORT_SEQUENCE => {
- for i in 0..SHORT_WIN_POINT0 {
- dst[i] = delay[i];
- }
- for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 {
- let j = i - SHORT_WIN_POINT0;
- dst[i] = delay[i] + self.ew_buf[j] * left_short_win[j];
- }
- for i in SHORT_WIN_POINT1..1024 {
- let j = i - SHORT_WIN_POINT0;
- dst[i] = self.ew_buf[j];
- }
- },
- LONG_STOP_SEQUENCE => {
- for i in 0..SHORT_WIN_POINT0 {
- dst[i] = delay[i];
- }
- for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 {
- dst[i] = delay[i] + self.tmp[i] * left_short_win[i - SHORT_WIN_POINT0];
- }
- for i in SHORT_WIN_POINT1..1024 {
- dst[i] = self.tmp[i];
- }
- },
- _ => unreachable!(""),
- };
- // save delay
- match seq {
- ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => {
- for i in 0..1024 {
- delay[i] = self.tmp[i + 1024] * long_win[1023 - i];
- }
- },
- EIGHT_SHORT_SEQUENCE => {
- for i in 0..SHORT_WIN_POINT1 { // last part is already windowed
- delay[i] = self.ew_buf[i + 512+64];
- }
- for i in SHORT_WIN_POINT1..1024 {
- delay[i] = 0.0;
- }
- },
- LONG_START_SEQUENCE => {
- for i in 0..SHORT_WIN_POINT0 {
- delay[i] = self.tmp[i + 1024];
- }
- for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 {
- delay[i] = self.tmp[i + 1024] * short_win[127 - (i - SHORT_WIN_POINT0)];
- }
- for i in SHORT_WIN_POINT1..1024 {
- delay[i] = 0.0;
- }
- },
- _ => unreachable!(""),
- };
- }
-}
-
-struct AACDecoder {
- info: Rc<NACodecInfo>,
- chmap: NAChannelMap,
- m4ainfo: M4AInfo,
- pairs: Vec<ChannelPair>,
- codebooks: Codebooks,
- dsp: DSP,
- sbinfo: GASubbandInfo,
-}
-
-impl AACDecoder {
- fn new() -> Self {
- AACDecoder {
- info: NACodecInfo::new_dummy(),
- chmap: NAChannelMap::new(),
- m4ainfo: M4AInfo::new(),
- pairs: Vec::new(),
- codebooks: Codebooks::new(),
- dsp: DSP::new(),
- sbinfo: AAC_SUBBAND_INFO[0],
- }
- }
- fn set_pair(&mut self, pair_no: usize, channel: usize, pair: bool) -> DecoderResult<()> {
- if self.pairs.len() <= pair_no {
- self.pairs.push(ChannelPair::new(pair, channel, self.sbinfo));
- } else {
- validate!(self.pairs[pair_no].channel == channel);
- validate!(self.pairs[pair_no].pair == pair);
- }
- validate!(if pair { channel + 1 } else { channel } < self.m4ainfo.channels);
- Ok(())
- }
- fn decode_ga(&mut self, br: &mut BitReader, abuf: &mut NABufferType) -> DecoderResult<()> {
- let mut cur_pair = 0;
- let mut cur_ch = 0;
- while br.left() > 3 {
- let id = br.read(3)?;
- match id {
- 0 => { // ID_SCE
- let _tag = br.read(4)?;
- self.set_pair(cur_pair, cur_ch, false)?;
- self.pairs[cur_pair].decode_ga_sce(br, &self.codebooks, self.m4ainfo.otype)?;
- cur_pair += 1;
- cur_ch += 1;
- },
- 1 => { // ID_CPE
- let _tag = br.read(4)?;
- self.set_pair(cur_pair, cur_ch, true)?;
- self.pairs[cur_pair].decode_ga_cpe(br, &self.codebooks, self.m4ainfo.otype)?;
- cur_pair += 1;
- cur_ch += 2;
- },
- 2 => { // ID_CCE
- unimplemented!("coupling channel element");
- },
- 3 => { // ID_LFE
- let _tag = br.read(4)?;
- self.set_pair(cur_pair, cur_ch, false)?;
- self.pairs[cur_pair].decode_ga_sce(br, &self.codebooks, self.m4ainfo.otype)?;
- cur_pair += 1;
- cur_ch += 1;
- },
- 4 => { // ID_DSE
- let _id = br.read(4)?;
- let align = br.read_bool()?;
- let mut count = br.read(8)? as u32;
- if count == 255 { count += br.read(8)? as u32; }
- if align { br.align(); }
- br.skip(count * 8)?; // no SBR payload or such
- },
- 5 => { // ID_PCE
- unimplemented!("program config");
- },
- 6 => { // ID_FIL
- let mut count = br.read(4)? as usize;
- if count == 15 {
- count += br.read(8)? as usize;
- count -= 1;
- }
- for _ in 0..count {
- // ext payload
- br.skip(8)?;
- }
- },
- 7 => { // ID_TERM
- break;
- },
- _ => { unreachable!(); },
- };
- }
- let srate_idx = GASubbandInfo::find_idx(self.m4ainfo.srate);
- for pair in 0..cur_pair {
- self.pairs[pair].synth_audio(&mut self.dsp, abuf, srate_idx);
- }
- Ok(())
- }
-}
-
-impl NADecoder for AACDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(_) = info.get_properties() {
- let edata = info.get_extradata().unwrap();
- validate!(edata.len() >= 2);
-
-//print!("edata:"); for s in edata.iter() { print!(" {:02X}", *s);}println!("");
- self.m4ainfo.read(&edata)?;
-
- //println!("{}", self.m4ainfo);
- if (self.m4ainfo.otype != M4AType::LC) || (self.m4ainfo.channels > 2) || (self.m4ainfo.samples != 1024) {
- return Err(DecoderError::NotImplemented);
- }
- self.sbinfo = GASubbandInfo::find(self.m4ainfo.srate);
-
- let ainfo = NAAudioInfo::new(self.m4ainfo.srate, self.m4ainfo.channels as u8,
- SND_F32P_FORMAT, self.m4ainfo.samples);
- self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo));
-
- if self.m4ainfo.channels >= DEFAULT_CHANNEL_MAP.len() {
- return Err(DecoderError::NotImplemented);
- }
- let chmap_str = DEFAULT_CHANNEL_MAP[self.m4ainfo.channels];
- if chmap_str.len() == 0 { return Err(DecoderError::NotImplemented); }
- self.chmap = NAChannelMap::from_str(chmap_str).unwrap();
-
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
-
- let ainfo = self.info.get_properties().get_audio_info().unwrap();
- let mut abuf = alloc_audio_buffer(ainfo, self.m4ainfo.samples, self.chmap.clone())?;
-
- let mut br = BitReader::new(&pktbuf, pktbuf.len(), BitReaderMode::BE);
- match self.m4ainfo.otype {
- M4AType::LC => {
- self.decode_ga(&mut br, &mut abuf)?;
- },
- _ => { unimplemented!(""); }
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(AACDecoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_aac() {
-// let file = "assets/RV/rv40_weighted_mc.rmvb";
- let file = "assets/RV/rv40_weighted_mc_2.rmvb";
- test_decode_audio("realmedia", file, Some(12000), "aac");
- }
-}
-
-const AAC_SCF_CODEBOOK_BITS: &[u8] = &[
- 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 18, 19, 18, 17, 17, 16, 17, 16, 16, 16, 16, 15, 15,
- 14, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 11, 12, 11, 10, 10,
- 10, 9, 9, 8, 8, 8, 7, 6, 6, 5, 4, 3, 1, 4, 4, 5,
- 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12,
- 12, 13, 13, 13, 14, 14, 16, 15, 16, 15, 18, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19
-];
-
-const AAC_SCF_CODEBOOK_CODES: &[u32] = &[
- 0x3FFE8, 0x3FFE6, 0x3FFE7, 0x3FFE5, 0x7FFF5, 0x7FFF1, 0x7FFED, 0x7FFF6,
- 0x7FFEE, 0x7FFEF, 0x7FFF0, 0x7FFFC, 0x7FFFD, 0x7FFFF, 0x7FFFE, 0x7FFF7,
- 0x7FFF8, 0x7FFFB, 0x7FFF9, 0x3FFE4, 0x7FFFA, 0x3FFE3, 0x1FFEF, 0x1FFF0,
- 0x0FFF5, 0x1FFEE, 0x0FFF2, 0x0FFF3, 0x0FFF4, 0x0FFF1, 0x07FF6, 0x07FF7,
- 0x03FF9, 0x03FF5, 0x03FF7, 0x03FF3, 0x03FF6, 0x03FF2, 0x01FF7, 0x01FF5,
- 0x00FF9, 0x00FF7, 0x00FF6, 0x007F9, 0x00FF4, 0x007F8, 0x003F9, 0x003F7,
- 0x003F5, 0x001F8, 0x001F7, 0x000FA, 0x000F8, 0x000F6, 0x00079, 0x0003A,
- 0x00038, 0x0001A, 0x0000B, 0x00004, 0x00000, 0x0000A, 0x0000C, 0x0001B,
- 0x00039, 0x0003B, 0x00078, 0x0007A, 0x000F7, 0x000F9, 0x001F6, 0x001F9,
- 0x003F4, 0x003F6, 0x003F8, 0x007F5, 0x007F4, 0x007F6, 0x007F7, 0x00FF5,
- 0x00FF8, 0x01FF4, 0x01FF6, 0x01FF8, 0x03FF8, 0x03FF4, 0x0FFF0, 0x07FF4,
- 0x0FFF6, 0x07FF5, 0x3FFE2, 0x7FFD9, 0x7FFDA, 0x7FFDB, 0x7FFDC, 0x7FFDD,
- 0x7FFDE, 0x7FFD8, 0x7FFD2, 0x7FFD3, 0x7FFD4, 0x7FFD5, 0x7FFD6, 0x7FFF2,
- 0x7FFDF, 0x7FFE7, 0x7FFE8, 0x7FFE9, 0x7FFEA, 0x7FFEB, 0x7FFE6, 0x7FFE0,
- 0x7FFE1, 0x7FFE2, 0x7FFE3, 0x7FFE4, 0x7FFE5, 0x7FFD7, 0x7FFEC, 0x7FFF4,
- 0x7FFF3
-];
-
-const AAC_SPEC_CB1_BITS: &[u8] = &[
- 11, 9, 11, 10, 7, 10, 11, 9, 11, 10, 7, 10, 7, 5, 7, 9,
- 7, 10, 11, 9, 11, 9, 7, 9, 11, 9, 11, 9, 7, 9, 7, 5,
- 7, 9, 7, 9, 7, 5, 7, 5, 1, 5, 7, 5, 7, 9, 7, 9,
- 7, 5, 7, 9, 7, 9, 11, 9, 11, 9, 7, 9, 11, 9, 11, 10,
- 7, 9, 7, 5, 7, 9, 7, 10, 11, 9, 11, 10, 7, 9, 11, 9,
- 11
-];
-const AAC_SPEC_CB1_CODES: &[u16] = &[
- 0x7f8, 0x1f1, 0x7fd, 0x3f5, 0x068, 0x3f0, 0x7f7, 0x1ec,
- 0x7f5, 0x3f1, 0x072, 0x3f4, 0x074, 0x011, 0x076, 0x1eb,
- 0x06c, 0x3f6, 0x7fc, 0x1e1, 0x7f1, 0x1f0, 0x061, 0x1f6,
- 0x7f2, 0x1ea, 0x7fb, 0x1f2, 0x069, 0x1ed, 0x077, 0x017,
- 0x06f, 0x1e6, 0x064, 0x1e5, 0x067, 0x015, 0x062, 0x012,
- 0x000, 0x014, 0x065, 0x016, 0x06d, 0x1e9, 0x063, 0x1e4,
- 0x06b, 0x013, 0x071, 0x1e3, 0x070, 0x1f3, 0x7fe, 0x1e7,
- 0x7f3, 0x1ef, 0x060, 0x1ee, 0x7f0, 0x1e2, 0x7fa, 0x3f3,
- 0x06a, 0x1e8, 0x075, 0x010, 0x073, 0x1f4, 0x06e, 0x3f7,
- 0x7f6, 0x1e0, 0x7f9, 0x3f2, 0x066, 0x1f5, 0x7ff, 0x1f7,
- 0x7f4
-];
-const AAC_SPEC_CB2_BITS: &[u8] = &[
- 9, 7, 9, 8, 6, 8, 9, 8, 9, 8, 6, 7, 6, 5, 6, 7,
- 6, 8, 9, 7, 8, 8, 6, 8, 9, 7, 9, 8, 6, 7, 6, 5,
- 6, 7, 6, 8, 6, 5, 6, 5, 3, 5, 6, 5, 6, 8, 6, 7,
- 6, 5, 6, 8, 6, 8, 9, 7, 9, 8, 6, 8, 8, 7, 9, 8,
- 6, 7, 6, 4, 6, 8, 6, 7, 9, 7, 9, 7, 6, 8, 9, 7,
- 9
-];
-const AAC_SPEC_CB2_CODES: &[u16] = &[
- 0x1f3, 0x06f, 0x1fd, 0x0eb, 0x023, 0x0ea, 0x1f7, 0x0e8,
- 0x1fa, 0x0f2, 0x02d, 0x070, 0x020, 0x006, 0x02b, 0x06e,
- 0x028, 0x0e9, 0x1f9, 0x066, 0x0f8, 0x0e7, 0x01b, 0x0f1,
- 0x1f4, 0x06b, 0x1f5, 0x0ec, 0x02a, 0x06c, 0x02c, 0x00a,
- 0x027, 0x067, 0x01a, 0x0f5, 0x024, 0x008, 0x01f, 0x009,
- 0x000, 0x007, 0x01d, 0x00b, 0x030, 0x0ef, 0x01c, 0x064,
- 0x01e, 0x00c, 0x029, 0x0f3, 0x02f, 0x0f0, 0x1fc, 0x071,
- 0x1f2, 0x0f4, 0x021, 0x0e6, 0x0f7, 0x068, 0x1f8, 0x0ee,
- 0x022, 0x065, 0x031, 0x002, 0x026, 0x0ed, 0x025, 0x06a,
- 0x1fb, 0x072, 0x1fe, 0x069, 0x02e, 0x0f6, 0x1ff, 0x06d,
- 0x1f6
-];
-const AAC_SPEC_CB3_BITS: &[u8] = &[
- 1, 4, 8, 4, 5, 8, 9, 9, 10, 4, 6, 9, 6, 6, 9, 9,
- 9, 10, 9, 10, 13, 9, 9, 11, 11, 10, 12, 4, 6, 10, 6, 7,
- 10, 10, 10, 12, 5, 7, 11, 6, 7, 10, 9, 9, 11, 9, 10, 13,
- 8, 9, 12, 10, 11, 12, 8, 10, 15, 9, 11, 15, 13, 14, 16, 8,
- 10, 14, 9, 10, 14, 12, 12, 15, 11, 12, 16, 10, 11, 15, 12, 12,
- 15
-];
-const AAC_SPEC_CB3_CODES: &[u16] = &[
- 0x0000, 0x0009, 0x00ef, 0x000b, 0x0019, 0x00f0, 0x01eb, 0x01e6,
- 0x03f2, 0x000a, 0x0035, 0x01ef, 0x0034, 0x0037, 0x01e9, 0x01ed,
- 0x01e7, 0x03f3, 0x01ee, 0x03ed, 0x1ffa, 0x01ec, 0x01f2, 0x07f9,
- 0x07f8, 0x03f8, 0x0ff8, 0x0008, 0x0038, 0x03f6, 0x0036, 0x0075,
- 0x03f1, 0x03eb, 0x03ec, 0x0ff4, 0x0018, 0x0076, 0x07f4, 0x0039,
- 0x0074, 0x03ef, 0x01f3, 0x01f4, 0x07f6, 0x01e8, 0x03ea, 0x1ffc,
- 0x00f2, 0x01f1, 0x0ffb, 0x03f5, 0x07f3, 0x0ffc, 0x00ee, 0x03f7,
- 0x7ffe, 0x01f0, 0x07f5, 0x7ffd, 0x1ffb, 0x3ffa, 0xffff, 0x00f1,
- 0x03f0, 0x3ffc, 0x01ea, 0x03ee, 0x3ffb, 0x0ff6, 0x0ffa, 0x7ffc,
- 0x07f2, 0x0ff5, 0xfffe, 0x03f4, 0x07f7, 0x7ffb, 0x0ff7, 0x0ff9,
- 0x7ffa
-];
-const AAC_SPEC_CB4_BITS: &[u8] = &[
- 4, 5, 8, 5, 4, 8, 9, 8, 11, 5, 5, 8, 5, 4, 8, 8,
- 7, 10, 9, 8, 11, 8, 8, 10, 11, 10, 11, 4, 5, 8, 4, 4,
- 8, 8, 8, 10, 4, 4, 8, 4, 4, 7, 8, 7, 9, 8, 8, 10,
- 7, 7, 9, 10, 9, 10, 8, 8, 11, 8, 7, 10, 11, 10, 12, 8,
- 7, 10, 7, 7, 9, 10, 9, 11, 11, 10, 12, 10, 9, 11, 11, 10,
- 11
-];
-const AAC_SPEC_CB4_CODES: &[u16] = &[
- 0x007, 0x016, 0x0f6, 0x018, 0x008, 0x0ef, 0x1ef, 0x0f3,
- 0x7f8, 0x019, 0x017, 0x0ed, 0x015, 0x001, 0x0e2, 0x0f0,
- 0x070, 0x3f0, 0x1ee, 0x0f1, 0x7fa, 0x0ee, 0x0e4, 0x3f2,
- 0x7f6, 0x3ef, 0x7fd, 0x005, 0x014, 0x0f2, 0x009, 0x004,
- 0x0e5, 0x0f4, 0x0e8, 0x3f4, 0x006, 0x002, 0x0e7, 0x003,
- 0x000, 0x06b, 0x0e3, 0x069, 0x1f3, 0x0eb, 0x0e6, 0x3f6,
- 0x06e, 0x06a, 0x1f4, 0x3ec, 0x1f0, 0x3f9, 0x0f5, 0x0ec,
- 0x7fb, 0x0ea, 0x06f, 0x3f7, 0x7f9, 0x3f3, 0xfff, 0x0e9,
- 0x06d, 0x3f8, 0x06c, 0x068, 0x1f5, 0x3ee, 0x1f2, 0x7f4,
- 0x7f7, 0x3f1, 0xffe, 0x3ed, 0x1f1, 0x7f5, 0x7fe, 0x3f5,
- 0x7fc
-];
-const AAC_SPEC_CB5_BITS: &[u8] = &[
- 13, 12, 11, 11, 10, 11, 11, 12, 13, 12, 11, 10, 9, 8, 9, 10,
- 11, 12, 12, 10, 9, 8, 7, 8, 9, 10, 11, 11, 9, 8, 5, 4,
- 5, 8, 9, 11, 10, 8, 7, 4, 1, 4, 7, 8, 11, 11, 9, 8,
- 5, 4, 5, 8, 9, 11, 11, 10, 9, 8, 7, 8, 9, 10, 11, 12,
- 11, 10, 9, 8, 9, 10, 11, 12, 13, 12, 12, 11, 10, 10, 11, 12,
- 13
-];
-const AAC_SPEC_CB5_CODES: &[u16] = &[
- 0x1fff, 0x0ff7, 0x07f4, 0x07e8, 0x03f1, 0x07ee, 0x07f9, 0x0ff8,
- 0x1ffd, 0x0ffd, 0x07f1, 0x03e8, 0x01e8, 0x00f0, 0x01ec, 0x03ee,
- 0x07f2, 0x0ffa, 0x0ff4, 0x03ef, 0x01f2, 0x00e8, 0x0070, 0x00ec,
- 0x01f0, 0x03ea, 0x07f3, 0x07eb, 0x01eb, 0x00ea, 0x001a, 0x0008,
- 0x0019, 0x00ee, 0x01ef, 0x07ed, 0x03f0, 0x00f2, 0x0073, 0x000b,
- 0x0000, 0x000a, 0x0071, 0x00f3, 0x07e9, 0x07ef, 0x01ee, 0x00ef,
- 0x0018, 0x0009, 0x001b, 0x00eb, 0x01e9, 0x07ec, 0x07f6, 0x03eb,
- 0x01f3, 0x00ed, 0x0072, 0x00e9, 0x01f1, 0x03ed, 0x07f7, 0x0ff6,
- 0x07f0, 0x03e9, 0x01ed, 0x00f1, 0x01ea, 0x03ec, 0x07f8, 0x0ff9,
- 0x1ffc, 0x0ffc, 0x0ff5, 0x07ea, 0x03f3, 0x03f2, 0x07f5, 0x0ffb,
- 0x1ffe
-];
-const AAC_SPEC_CB6_BITS: &[u8] = &[
- 11, 10, 9, 9, 9, 9, 9, 10, 11, 10, 9, 8, 7, 7, 7, 8,
- 9, 10, 9, 8, 6, 6, 6, 6, 6, 8, 9, 9, 7, 6, 4, 4,
- 4, 6, 7, 9, 9, 7, 6, 4, 4, 4, 6, 7, 9, 9, 7, 6,
- 4, 4, 4, 6, 7, 9, 9, 8, 6, 6, 6, 6, 6, 8, 9, 10,
- 9, 8, 7, 7, 7, 7, 8, 10, 11, 10, 9, 9, 9, 9, 9, 10,
- 11
-];
-const AAC_SPEC_CB6_CODES: &[u16] = &[
- 0x7fe, 0x3fd, 0x1f1, 0x1eb, 0x1f4, 0x1ea, 0x1f0, 0x3fc,
- 0x7fd, 0x3f6, 0x1e5, 0x0ea, 0x06c, 0x071, 0x068, 0x0f0,
- 0x1e6, 0x3f7, 0x1f3, 0x0ef, 0x032, 0x027, 0x028, 0x026,
- 0x031, 0x0eb, 0x1f7, 0x1e8, 0x06f, 0x02e, 0x008, 0x004,
- 0x006, 0x029, 0x06b, 0x1ee, 0x1ef, 0x072, 0x02d, 0x002,
- 0x000, 0x003, 0x02f, 0x073, 0x1fa, 0x1e7, 0x06e, 0x02b,
- 0x007, 0x001, 0x005, 0x02c, 0x06d, 0x1ec, 0x1f9, 0x0ee,
- 0x030, 0x024, 0x02a, 0x025, 0x033, 0x0ec, 0x1f2, 0x3f8,
- 0x1e4, 0x0ed, 0x06a, 0x070, 0x069, 0x074, 0x0f1, 0x3fa,
- 0x7ff, 0x3f9, 0x1f6, 0x1ed, 0x1f8, 0x1e9, 0x1f5, 0x3fb,
- 0x7fc
-];
-const AAC_SPEC_CB7_BITS: &[u8] = &[
- 1, 3, 6, 7, 8, 9, 10, 11, 3, 4, 6, 7, 8, 8, 9, 9,
- 6, 6, 7, 8, 8, 9, 9, 10, 7, 7, 8, 8, 9, 9, 10, 10,
- 8, 8, 9, 9, 10, 10, 10, 11, 9, 8, 9, 9, 10, 10, 11, 11,
- 10, 9, 9, 10, 10, 11, 12, 12, 11, 10, 10, 10, 11, 11, 12, 12
-];
-const AAC_SPEC_CB7_CODES: &[u16] = &[
- 0x000, 0x005, 0x037, 0x074, 0x0f2, 0x1eb, 0x3ed, 0x7f7,
- 0x004, 0x00c, 0x035, 0x071, 0x0ec, 0x0ee, 0x1ee, 0x1f5,
- 0x036, 0x034, 0x072, 0x0ea, 0x0f1, 0x1e9, 0x1f3, 0x3f5,
- 0x073, 0x070, 0x0eb, 0x0f0, 0x1f1, 0x1f0, 0x3ec, 0x3fa,
- 0x0f3, 0x0ed, 0x1e8, 0x1ef, 0x3ef, 0x3f1, 0x3f9, 0x7fb,
- 0x1ed, 0x0ef, 0x1ea, 0x1f2, 0x3f3, 0x3f8, 0x7f9, 0x7fc,
- 0x3ee, 0x1ec, 0x1f4, 0x3f4, 0x3f7, 0x7f8, 0xffd, 0xffe,
- 0x7f6, 0x3f0, 0x3f2, 0x3f6, 0x7fa, 0x7fd, 0xffc, 0xfff
-];
-const AAC_SPEC_CB8_BITS: &[u8] = &[
- 5, 4, 5, 6, 7, 8, 9, 10, 4, 3, 4, 5, 6, 7, 7, 8,
- 5, 4, 4, 5, 6, 7, 7, 8, 6, 5, 5, 6, 6, 7, 8, 8,
- 7, 6, 6, 6, 7, 7, 8, 9, 8, 7, 6, 7, 7, 8, 8, 10,
- 9, 7, 7, 8, 8, 8, 9, 9, 10, 8, 8, 8, 9, 9, 9, 10
-];
-const AAC_SPEC_CB8_CODES: &[u16] = &[
- 0x00e, 0x005, 0x010, 0x030, 0x06f, 0x0f1, 0x1fa, 0x3fe,
- 0x003, 0x000, 0x004, 0x012, 0x02c, 0x06a, 0x075, 0x0f8,
- 0x00f, 0x002, 0x006, 0x014, 0x02e, 0x069, 0x072, 0x0f5,
- 0x02f, 0x011, 0x013, 0x02a, 0x032, 0x06c, 0x0ec, 0x0fa,
- 0x071, 0x02b, 0x02d, 0x031, 0x06d, 0x070, 0x0f2, 0x1f9,
- 0x0ef, 0x068, 0x033, 0x06b, 0x06e, 0x0ee, 0x0f9, 0x3fc,
- 0x1f8, 0x074, 0x073, 0x0ed, 0x0f0, 0x0f6, 0x1f6, 0x1fd,
- 0x3fd, 0x0f3, 0x0f4, 0x0f7, 0x1f7, 0x1fb, 0x1fc, 0x3ff
-];
-const AAC_SPEC_CB9_BITS: &[u8] = &[
- 1, 3, 6, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6,
- 7, 8, 8, 9, 10, 10, 10, 11, 12, 12, 6, 6, 7, 8, 8, 9,
- 10, 10, 10, 11, 12, 12, 12, 8, 7, 8, 9, 9, 10, 10, 11, 11,
- 11, 12, 12, 13, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12,
- 13, 10, 9, 9, 10, 11, 11, 11, 12, 11, 12, 12, 13, 13, 11, 9,
- 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 11, 10, 10, 11, 11,
- 12, 12, 13, 13, 13, 13, 13, 13, 11, 10, 10, 11, 11, 11, 12, 12,
- 13, 13, 14, 13, 14, 11, 10, 11, 11, 12, 12, 12, 12, 13, 13, 14,
- 14, 14, 12, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 12,
- 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 13, 12, 12, 12,
- 13, 13, 13, 13, 14, 14, 14, 14, 15
-];
-const AAC_SPEC_CB9_CODES: &[u16] = &[
- 0x0000, 0x0005, 0x0037, 0x00e7, 0x01de, 0x03ce, 0x03d9, 0x07c8,
- 0x07cd, 0x0fc8, 0x0fdd, 0x1fe4, 0x1fec, 0x0004, 0x000c, 0x0035,
- 0x0072, 0x00ea, 0x00ed, 0x01e2, 0x03d1, 0x03d3, 0x03e0, 0x07d8,
- 0x0fcf, 0x0fd5, 0x0036, 0x0034, 0x0071, 0x00e8, 0x00ec, 0x01e1,
- 0x03cf, 0x03dd, 0x03db, 0x07d0, 0x0fc7, 0x0fd4, 0x0fe4, 0x00e6,
- 0x0070, 0x00e9, 0x01dd, 0x01e3, 0x03d2, 0x03dc, 0x07cc, 0x07ca,
- 0x07de, 0x0fd8, 0x0fea, 0x1fdb, 0x01df, 0x00eb, 0x01dc, 0x01e6,
- 0x03d5, 0x03de, 0x07cb, 0x07dd, 0x07dc, 0x0fcd, 0x0fe2, 0x0fe7,
- 0x1fe1, 0x03d0, 0x01e0, 0x01e4, 0x03d6, 0x07c5, 0x07d1, 0x07db,
- 0x0fd2, 0x07e0, 0x0fd9, 0x0feb, 0x1fe3, 0x1fe9, 0x07c4, 0x01e5,
- 0x03d7, 0x07c6, 0x07cf, 0x07da, 0x0fcb, 0x0fda, 0x0fe3, 0x0fe9,
- 0x1fe6, 0x1ff3, 0x1ff7, 0x07d3, 0x03d8, 0x03e1, 0x07d4, 0x07d9,
- 0x0fd3, 0x0fde, 0x1fdd, 0x1fd9, 0x1fe2, 0x1fea, 0x1ff1, 0x1ff6,
- 0x07d2, 0x03d4, 0x03da, 0x07c7, 0x07d7, 0x07e2, 0x0fce, 0x0fdb,
- 0x1fd8, 0x1fee, 0x3ff0, 0x1ff4, 0x3ff2, 0x07e1, 0x03df, 0x07c9,
- 0x07d6, 0x0fca, 0x0fd0, 0x0fe5, 0x0fe6, 0x1feb, 0x1fef, 0x3ff3,
- 0x3ff4, 0x3ff5, 0x0fe0, 0x07ce, 0x07d5, 0x0fc6, 0x0fd1, 0x0fe1,
- 0x1fe0, 0x1fe8, 0x1ff0, 0x3ff1, 0x3ff8, 0x3ff6, 0x7ffc, 0x0fe8,
- 0x07df, 0x0fc9, 0x0fd7, 0x0fdc, 0x1fdc, 0x1fdf, 0x1fed, 0x1ff5,
- 0x3ff9, 0x3ffb, 0x7ffd, 0x7ffe, 0x1fe7, 0x0fcc, 0x0fd6, 0x0fdf,
- 0x1fde, 0x1fda, 0x1fe5, 0x1ff2, 0x3ffa, 0x3ff7, 0x3ffc, 0x3ffd,
- 0x7fff
-];
-const AAC_SPEC_CB10_BITS: &[u8] = &[
- 6, 5, 6, 6, 7, 8, 9, 10, 10, 10, 11, 11, 12, 5, 4, 4,
- 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 6, 4, 5, 5, 6, 6,
- 7, 8, 8, 9, 9, 10, 10, 6, 5, 5, 5, 6, 7, 7, 8, 8,
- 9, 9, 10, 10, 7, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10,
- 10, 8, 7, 6, 7, 7, 7, 8, 8, 8, 9, 10, 10, 11, 9, 7,
- 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 9, 8, 8, 8, 8,
- 8, 9, 9, 9, 10, 10, 11, 11, 9, 8, 8, 8, 8, 8, 9, 9,
- 10, 10, 10, 11, 11, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 11,
- 11, 12, 10, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 11,
- 10, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 11, 10, 10, 10,
- 10, 10, 10, 11, 11, 12, 12, 12, 12
-];
-const AAC_SPEC_CB10_CODES: &[u16] = &[
- 0x022, 0x008, 0x01d, 0x026, 0x05f, 0x0d3, 0x1cf, 0x3d0,
- 0x3d7, 0x3ed, 0x7f0, 0x7f6, 0xffd, 0x007, 0x000, 0x001,
- 0x009, 0x020, 0x054, 0x060, 0x0d5, 0x0dc, 0x1d4, 0x3cd,
- 0x3de, 0x7e7, 0x01c, 0x002, 0x006, 0x00c, 0x01e, 0x028,
- 0x05b, 0x0cd, 0x0d9, 0x1ce, 0x1dc, 0x3d9, 0x3f1, 0x025,
- 0x00b, 0x00a, 0x00d, 0x024, 0x057, 0x061, 0x0cc, 0x0dd,
- 0x1cc, 0x1de, 0x3d3, 0x3e7, 0x05d, 0x021, 0x01f, 0x023,
- 0x027, 0x059, 0x064, 0x0d8, 0x0df, 0x1d2, 0x1e2, 0x3dd,
- 0x3ee, 0x0d1, 0x055, 0x029, 0x056, 0x058, 0x062, 0x0ce,
- 0x0e0, 0x0e2, 0x1da, 0x3d4, 0x3e3, 0x7eb, 0x1c9, 0x05e,
- 0x05a, 0x05c, 0x063, 0x0ca, 0x0da, 0x1c7, 0x1ca, 0x1e0,
- 0x3db, 0x3e8, 0x7ec, 0x1e3, 0x0d2, 0x0cb, 0x0d0, 0x0d7,
- 0x0db, 0x1c6, 0x1d5, 0x1d8, 0x3ca, 0x3da, 0x7ea, 0x7f1,
- 0x1e1, 0x0d4, 0x0cf, 0x0d6, 0x0de, 0x0e1, 0x1d0, 0x1d6,
- 0x3d1, 0x3d5, 0x3f2, 0x7ee, 0x7fb, 0x3e9, 0x1cd, 0x1c8,
- 0x1cb, 0x1d1, 0x1d7, 0x1df, 0x3cf, 0x3e0, 0x3ef, 0x7e6,
- 0x7f8, 0xffa, 0x3eb, 0x1dd, 0x1d3, 0x1d9, 0x1db, 0x3d2,
- 0x3cc, 0x3dc, 0x3ea, 0x7ed, 0x7f3, 0x7f9, 0xff9, 0x7f2,
- 0x3ce, 0x1e4, 0x3cb, 0x3d8, 0x3d6, 0x3e2, 0x3e5, 0x7e8,
- 0x7f4, 0x7f5, 0x7f7, 0xffb, 0x7fa, 0x3ec, 0x3df, 0x3e1,
- 0x3e4, 0x3e6, 0x3f0, 0x7e9, 0x7ef, 0xff8, 0xffe, 0xffc,
- 0xfff
-];
-const AAC_SPEC_CB11_BITS: &[u8] = &[
- 4, 5, 6, 7, 8, 8, 9, 10, 10, 10, 11, 11, 12, 11, 12, 12,
- 10, 5, 4, 5, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10,
- 11, 8, 6, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10,
- 10, 10, 8, 7, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10,
- 10, 10, 10, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9,
- 10, 10, 10, 10, 8, 8, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9,
- 9, 10, 10, 10, 10, 8, 9, 8, 8, 8, 8, 8, 8, 8, 9, 9,
- 9, 10, 10, 10, 10, 10, 8, 9, 8, 8, 8, 8, 8, 8, 9, 9,
- 9, 10, 10, 10, 10, 10, 10, 8, 10, 9, 8, 8, 9, 9, 9, 9,
- 9, 10, 10, 10, 10, 10, 10, 11, 8, 10, 9, 9, 9, 9, 9, 9,
- 9, 10, 10, 10, 10, 10, 10, 11, 11, 8, 11, 9, 9, 9, 9, 9,
- 9, 10, 10, 10, 10, 10, 11, 10, 11, 11, 8, 11, 10, 9, 9, 10,
- 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 9, 11, 10, 9,
- 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 9, 11, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 9, 12,
- 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 9,
- 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
- 5
-];
-const AAC_SPEC_CB11_CODES: &[u16] = &[
- 0x000, 0x006, 0x019, 0x03d, 0x09c, 0x0c6, 0x1a7, 0x390,
- 0x3c2, 0x3df, 0x7e6, 0x7f3, 0xffb, 0x7ec, 0xffa, 0xffe,
- 0x38e, 0x005, 0x001, 0x008, 0x014, 0x037, 0x042, 0x092,
- 0x0af, 0x191, 0x1a5, 0x1b5, 0x39e, 0x3c0, 0x3a2, 0x3cd,
- 0x7d6, 0x0ae, 0x017, 0x007, 0x009, 0x018, 0x039, 0x040,
- 0x08e, 0x0a3, 0x0b8, 0x199, 0x1ac, 0x1c1, 0x3b1, 0x396,
- 0x3be, 0x3ca, 0x09d, 0x03c, 0x015, 0x016, 0x01a, 0x03b,
- 0x044, 0x091, 0x0a5, 0x0be, 0x196, 0x1ae, 0x1b9, 0x3a1,
- 0x391, 0x3a5, 0x3d5, 0x094, 0x09a, 0x036, 0x038, 0x03a,
- 0x041, 0x08c, 0x09b, 0x0b0, 0x0c3, 0x19e, 0x1ab, 0x1bc,
- 0x39f, 0x38f, 0x3a9, 0x3cf, 0x093, 0x0bf, 0x03e, 0x03f,
- 0x043, 0x045, 0x09e, 0x0a7, 0x0b9, 0x194, 0x1a2, 0x1ba,
- 0x1c3, 0x3a6, 0x3a7, 0x3bb, 0x3d4, 0x09f, 0x1a0, 0x08f,
- 0x08d, 0x090, 0x098, 0x0a6, 0x0b6, 0x0c4, 0x19f, 0x1af,
- 0x1bf, 0x399, 0x3bf, 0x3b4, 0x3c9, 0x3e7, 0x0a8, 0x1b6,
- 0x0ab, 0x0a4, 0x0aa, 0x0b2, 0x0c2, 0x0c5, 0x198, 0x1a4,
- 0x1b8, 0x38c, 0x3a4, 0x3c4, 0x3c6, 0x3dd, 0x3e8, 0x0ad,
- 0x3af, 0x192, 0x0bd, 0x0bc, 0x18e, 0x197, 0x19a, 0x1a3,
- 0x1b1, 0x38d, 0x398, 0x3b7, 0x3d3, 0x3d1, 0x3db, 0x7dd,
- 0x0b4, 0x3de, 0x1a9, 0x19b, 0x19c, 0x1a1, 0x1aa, 0x1ad,
- 0x1b3, 0x38b, 0x3b2, 0x3b8, 0x3ce, 0x3e1, 0x3e0, 0x7d2,
- 0x7e5, 0x0b7, 0x7e3, 0x1bb, 0x1a8, 0x1a6, 0x1b0, 0x1b2,
- 0x1b7, 0x39b, 0x39a, 0x3ba, 0x3b5, 0x3d6, 0x7d7, 0x3e4,
- 0x7d8, 0x7ea, 0x0ba, 0x7e8, 0x3a0, 0x1bd, 0x1b4, 0x38a,
- 0x1c4, 0x392, 0x3aa, 0x3b0, 0x3bc, 0x3d7, 0x7d4, 0x7dc,
- 0x7db, 0x7d5, 0x7f0, 0x0c1, 0x7fb, 0x3c8, 0x3a3, 0x395,
- 0x39d, 0x3ac, 0x3ae, 0x3c5, 0x3d8, 0x3e2, 0x3e6, 0x7e4,
- 0x7e7, 0x7e0, 0x7e9, 0x7f7, 0x190, 0x7f2, 0x393, 0x1be,
- 0x1c0, 0x394, 0x397, 0x3ad, 0x3c3, 0x3c1, 0x3d2, 0x7da,
- 0x7d9, 0x7df, 0x7eb, 0x7f4, 0x7fa, 0x195, 0x7f8, 0x3bd,
- 0x39c, 0x3ab, 0x3a8, 0x3b3, 0x3b9, 0x3d0, 0x3e3, 0x3e5,
- 0x7e2, 0x7de, 0x7ed, 0x7f1, 0x7f9, 0x7fc, 0x193, 0xffd,
- 0x3dc, 0x3b6, 0x3c7, 0x3cc, 0x3cb, 0x3d9, 0x3da, 0x7d3,
- 0x7e1, 0x7ee, 0x7ef, 0x7f5, 0x7f6, 0xffc, 0xfff, 0x19d,
- 0x1c2, 0x0b5, 0x0a1, 0x096, 0x097, 0x095, 0x099, 0x0a0,
- 0x0a2, 0x0ac, 0x0a9, 0x0b1, 0x0b3, 0x0bb, 0x0c0, 0x18f,
- 0x004
-];
-
-const AAC_SPEC_BITS: [&[u8]; 11] = [
- AAC_SPEC_CB1_BITS, AAC_SPEC_CB2_BITS, AAC_SPEC_CB3_BITS, AAC_SPEC_CB4_BITS,
- AAC_SPEC_CB5_BITS, AAC_SPEC_CB6_BITS, AAC_SPEC_CB7_BITS, AAC_SPEC_CB8_BITS,
- AAC_SPEC_CB9_BITS, AAC_SPEC_CB10_BITS, AAC_SPEC_CB11_BITS
-];
-const AAC_SPEC_CODES: [&[u16]; 11] = [
- AAC_SPEC_CB1_CODES, AAC_SPEC_CB2_CODES, AAC_SPEC_CB3_CODES, AAC_SPEC_CB4_CODES,
- AAC_SPEC_CB5_CODES, AAC_SPEC_CB6_CODES, AAC_SPEC_CB7_CODES, AAC_SPEC_CB8_CODES,
- AAC_SPEC_CB9_CODES, AAC_SPEC_CB10_CODES, AAC_SPEC_CB11_CODES
-];
-const AAC_UNSIGNED_CODEBOOK: [bool; 11] = [
- false, false, true, true, false, false, true, true, true, true, true
-];
-const AAC_CODEBOOK_MODULO: [u16; 7] = [
- 9, 9, 8, 8, 13, 13, 17
-];
-
-const AAC_QUADS: [[i8; 4]; 81] = [
- [ 0, 0, 0, 0 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 2 ],
- [ 0, 0, 1, 0 ], [ 0, 0, 1, 1 ], [ 0, 0, 1, 2 ],
- [ 0, 0, 2, 0 ], [ 0, 0, 2, 1 ], [ 0, 0, 2, 2 ],
- [ 0, 1, 0, 0 ], [ 0, 1, 0, 1 ], [ 0, 1, 0, 2 ],
- [ 0, 1, 1, 0 ], [ 0, 1, 1, 1 ], [ 0, 1, 1, 2 ],
- [ 0, 1, 2, 0 ], [ 0, 1, 2, 1 ], [ 0, 1, 2, 2 ],
- [ 0, 2, 0, 0 ], [ 0, 2, 0, 1 ], [ 0, 2, 0, 2 ],
- [ 0, 2, 1, 0 ], [ 0, 2, 1, 1 ], [ 0, 2, 1, 2 ],
- [ 0, 2, 2, 0 ], [ 0, 2, 2, 1 ], [ 0, 2, 2, 2 ],
- [ 1, 0, 0, 0 ], [ 1, 0, 0, 1 ], [ 1, 0, 0, 2 ],
- [ 1, 0, 1, 0 ], [ 1, 0, 1, 1 ], [ 1, 0, 1, 2 ],
- [ 1, 0, 2, 0 ], [ 1, 0, 2, 1 ], [ 1, 0, 2, 2 ],
- [ 1, 1, 0, 0 ], [ 1, 1, 0, 1 ], [ 1, 1, 0, 2 ],
- [ 1, 1, 1, 0 ], [ 1, 1, 1, 1 ], [ 1, 1, 1, 2 ],
- [ 1, 1, 2, 0 ], [ 1, 1, 2, 1 ], [ 1, 1, 2, 2 ],
- [ 1, 2, 0, 0 ], [ 1, 2, 0, 1 ], [ 1, 2, 0, 2 ],
- [ 1, 2, 1, 0 ], [ 1, 2, 1, 1 ], [ 1, 2, 1, 2 ],
- [ 1, 2, 2, 0 ], [ 1, 2, 2, 1 ], [ 1, 2, 2, 2 ],
- [ 2, 0, 0, 0 ], [ 2, 0, 0, 1 ], [ 2, 0, 0, 2 ],
- [ 2, 0, 1, 0 ], [ 2, 0, 1, 1 ], [ 2, 0, 1, 2 ],
- [ 2, 0, 2, 0 ], [ 2, 0, 2, 1 ], [ 2, 0, 2, 2 ],
- [ 2, 1, 0, 0 ], [ 2, 1, 0, 1 ], [ 2, 1, 0, 2 ],
- [ 2, 1, 1, 0 ], [ 2, 1, 1, 1 ], [ 2, 1, 1, 2 ],
- [ 2, 1, 2, 0 ], [ 2, 1, 2, 1 ], [ 2, 1, 2, 2 ],
- [ 2, 2, 0, 0 ], [ 2, 2, 0, 1 ], [ 2, 2, 0, 2 ],
- [ 2, 2, 1, 0 ], [ 2, 2, 1, 1 ], [ 2, 2, 1, 2 ],
- [ 2, 2, 2, 0 ], [ 2, 2, 2, 1 ], [ 2, 2, 2, 2 ],
-];
-
-const DEFAULT_CHANNEL_MAP: [&str; 9] = [
- "",
- "C",
- "L,R",
- "C,L,R",
- "C,L,R,Cs",
- "C,L,R,Ls,Rs",
- "C,L,R,Ls,Rs,LFE",
- "",
- "C,L,R,Ls,Rs,Lss,Rss,LFE",
-];
-
-const SWB_OFFSET_48K_LONG: [usize; 49+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 48, 56, 64, 72, 80,
- 88, 96, 108, 120, 132, 144, 160, 176,
- 196, 216, 240, 264, 292, 320, 352, 384,
- 416, 448, 480, 512, 544, 576, 608, 640,
- 672, 704, 736, 768, 800, 832, 864, 896,
- 928, 1024
-];
-const SWB_OFFSET_48K_SHORT: [usize; 14+1] = [
- 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128
-];
-const SWB_OFFSET_32K_LONG: [usize; 51+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 48, 56, 64, 72, 80,
- 88, 96, 108, 120, 132, 144, 160, 176,
- 196, 216, 240, 264, 292, 320, 352, 384,
- 416, 448, 480, 512, 544, 576, 608, 640,
- 672, 704, 736, 768, 800, 832, 864, 896,
- 928, 960, 992, 1024
-];
-const SWB_OFFSET_8K_LONG: [usize; 40+1] = [
- 0, 12, 24, 36, 48, 60, 72, 84,
- 96, 108, 120, 132, 144, 156, 172, 188,
- 204, 220, 236, 252, 268, 288, 308, 328,
- 348, 372, 396, 420, 448, 476, 508, 544,
- 580, 620, 664, 712, 764, 820, 880, 944,
- 1024
-];
-const SWB_OFFSET_8K_SHORT: [usize; 15+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128
-];
-const SWB_OFFSET_16K_LONG: [usize; 43+1] = [
- 0, 8, 16, 24, 32, 40, 48, 56,
- 64, 72, 80, 88, 100, 112, 124, 136,
- 148, 160, 172, 184, 196, 212, 228, 244,
- 260, 280, 300, 320, 344, 368, 396, 424,
- 456, 492, 532, 572, 616, 664, 716, 772,
- 832, 896, 960, 1024
-];
-const SWB_OFFSET_16K_SHORT: [usize; 15+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128
-];
-const SWB_OFFSET_24K_LONG: [usize; 47+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 44, 52, 60, 68, 76,
- 84, 92, 100, 108, 116, 124, 136, 148,
- 160, 172, 188, 204, 220, 240, 260, 284,
- 308, 336, 364, 396, 432, 468, 508, 552,
- 600, 652, 704, 768, 832, 896, 960, 1024
-];
-const SWB_OFFSET_24K_SHORT: [usize; 15+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128
-];
-const SWB_OFFSET_64K_LONG: [usize; 47+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 44, 48, 52, 56, 64,
- 72, 80, 88, 100, 112, 124, 140, 156,
- 172, 192, 216, 240, 268, 304, 344, 384,
- 424, 464, 504, 544, 584, 624, 664, 704,
- 744, 784, 824, 864, 904, 944, 984, 1024
-];
-const SWB_OFFSET_64K_SHORT: [usize; 12+1] = [
- 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
-];
-const SWB_OFFSET_96K_LONG: [usize; 41+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 44, 48, 52, 56, 64,
- 72, 80, 88, 96, 108, 120, 132, 144,
- 156, 172, 188, 212, 240, 276, 320, 384,
- 448, 512, 576, 640, 704, 768, 832, 896,
- 960, 1024
-];
-
-#[derive(Clone,Copy)]
-struct GASubbandInfo {
- min_srate: u32,
- long_bands: &'static [usize],
- short_bands: &'static [usize],
-}
-
-impl GASubbandInfo {
- fn find(srate: u32) -> GASubbandInfo {
- for i in 0..AAC_SUBBAND_INFO.len() {
- if srate >= AAC_SUBBAND_INFO[i].min_srate {
- return AAC_SUBBAND_INFO[i];
- }
- }
- unreachable!("")
- }
- fn find_idx(srate: u32) -> usize {
- for i in 0..AAC_SUBBAND_INFO.len() {
- if srate >= AAC_SUBBAND_INFO[i].min_srate {
- return i;
- }
- }
- unreachable!("")
- }
-}
-
-const AAC_SUBBAND_INFO: [GASubbandInfo; 12] = [
- GASubbandInfo { min_srate: 92017, long_bands: &SWB_OFFSET_96K_LONG, short_bands: &SWB_OFFSET_64K_SHORT }, //96K
- GASubbandInfo { min_srate: 75132, long_bands: &SWB_OFFSET_96K_LONG, short_bands: &SWB_OFFSET_64K_SHORT }, //88.2K
- GASubbandInfo { min_srate: 55426, long_bands: &SWB_OFFSET_64K_LONG, short_bands: &SWB_OFFSET_64K_SHORT }, //64K
- GASubbandInfo { min_srate: 46009, long_bands: &SWB_OFFSET_48K_LONG, short_bands: &SWB_OFFSET_48K_SHORT }, //48K
- GASubbandInfo { min_srate: 37566, long_bands: &SWB_OFFSET_48K_LONG, short_bands: &SWB_OFFSET_48K_SHORT }, //44.1K
- GASubbandInfo { min_srate: 27713, long_bands: &SWB_OFFSET_32K_LONG, short_bands: &SWB_OFFSET_48K_SHORT }, //32K
- GASubbandInfo { min_srate: 23004, long_bands: &SWB_OFFSET_24K_LONG, short_bands: &SWB_OFFSET_24K_SHORT }, //24K
- GASubbandInfo { min_srate: 18783, long_bands: &SWB_OFFSET_24K_LONG, short_bands: &SWB_OFFSET_24K_SHORT }, //22.05K
- GASubbandInfo { min_srate: 13856, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //16K
- GASubbandInfo { min_srate: 11502, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //12K
- GASubbandInfo { min_srate: 9391, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //11.025K
- GASubbandInfo { min_srate: 0, long_bands: &SWB_OFFSET_8K_LONG, short_bands: &SWB_OFFSET_8K_SHORT }, //8K
-];
diff --git a/nihav-core/src/codecs/atrac3.rs b/nihav-core/src/codecs/atrac3.rs
deleted file mode 100644
index 5281892..0000000
--- a/nihav-core/src/codecs/atrac3.rs
+++ /dev/null
@@ -1,765 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use super::*;
-use crate::io::bitreader::*;
-use crate::io::byteio::*;
-use crate::io::codebook::*;
-use crate::dsp::fft::FFTMode;
-use crate::dsp::mdct::IMDCT;
-use std::f32::consts;
-
-#[derive(Clone,Copy,PartialEq)]
-enum Mode {
- Mono,
- Stereo,
- JointStereo,
-}
-
-const ATRAC3_FRAME_SIZE: usize = 1024;
-
-#[derive(Clone,Copy)]
-struct Tone {
- pos: usize,
- ncoeffs: usize,
- coeffs: [f32; 8],
-}
-
-struct GainData {
- ngains: [usize; 4],
- gain_lev: [[usize; 8]; 4],
- gain_loc: [[usize; 8]; 4],
-}
-
-impl GainData {
- fn new() -> Self {
- Self {
- ngains: [0; 4],
- gain_lev: [[0; 8]; 4],
- gain_loc: [[0; 8]; 4],
- }
- }
- fn read(&mut self, br: &mut BitReader, bands: usize) -> DecoderResult<()> {
- self.ngains = [0; 4];
- for band in 0..bands {
- self.ngains[band] = br.read(3)? as usize;
- for i in 0..self.ngains[band] {
- self.gain_lev[band][i] = br.read(4)? as usize;
- self.gain_loc[band][i] = br.read(5)? as usize;
- }
- }
- Ok(())
- }
-}
-
-struct Channel {
- data: [f32; ATRAC3_FRAME_SIZE],
- delay: [f32; ATRAC3_FRAME_SIZE],
- qmf_delay: [f32; 64 * 3],
-
- bands: usize,
- block_no: usize,
-
- gain_data: [GainData; 2],
-
- subbands: usize,
- components: usize,
- ntones: usize,
- tones: [Tone; 64],
-}
-
-impl Channel {
- fn new() -> Self {
- Self {
- data: [0.0; ATRAC3_FRAME_SIZE],
- delay: [0.0; ATRAC3_FRAME_SIZE],
- qmf_delay: [0.0; 64 * 3],
-
- bands: 0,
- block_no: 0,
-
- gain_data: [GainData::new(), GainData::new()],
-
- subbands: 0,
- components: 0,
- ntones: 0,
- tones: [Tone {pos: 0, ncoeffs: 0, coeffs: [0.0; 8]}; 64],
- }
- }
- fn decode_unit(&mut self, br: &mut BitReader, codebooks: &[Codebook<u8>; 7], scalefactors: &[f32; 64]) -> DecoderResult<()> {
- self.bands = (br.read(2)? as usize) + 1;
- self.gain_data[self.block_no].read(br, self.bands)?;
- self.data = [0.0; ATRAC3_FRAME_SIZE];
-
- self.ntones = 0;
- self.components = br.read(5)? as usize;
- if self.components > 0 {
- let selector = br.read(2)?;
- validate!(selector != 2);
- let mut mode0 = (selector & 1) != 0;
-
- for _ in 0..self.components {
- let mut flags: [bool; 4] = [false; 4];
- for band in 0..self.bands {
- flags[band] = br.read_bool()?;
- }
- let nvals = br.read(3)? as usize;
- let quant = br.read(3)? as usize;
- validate!(quant > 1);
- if selector == 3 {
- mode0 = br.read_bool()?;
- }
- for j in 0..self.bands*4 {
- if !flags[j >> 2] { continue; }
- let count = br.read(3)? as usize;
- validate!(self.ntones + count < 64);
- for _ in 0..count {
- let scale_idx = br.read(6)? as usize;
- let tone = &mut self.tones[self.ntones];
- tone.pos = (br.read(6)? as usize) + j * 64;
- tone.ncoeffs = (ATRAC3_FRAME_SIZE - tone.pos).min(nvals + 1);
- let scale = scalefactors[scale_idx] * ATRAC3_MAX_QUANT[quant];
- read_coeffs(br, codebooks, &mut tone.coeffs[..tone.ncoeffs], quant, scale, mode0)?;
- self.ntones += 1;
- }
- }
- }
- }
-
- // spectrum
- let mut quants: [usize; 32] = [0; 32];
- let mut scf: [usize; 32] = [0; 32];
- self.subbands = (br.read(5)? as usize) + 1;
- let mode0 = br.read_bool()?;
- for i in 0..self.subbands {
- quants[i] = br.read(3)? as usize;
- }
- for i in 0..self.subbands {
- if quants[i] == 0 { continue; }
- scf[i] = br.read(6)? as usize;
- }
-
- self.data = [0.0; ATRAC3_FRAME_SIZE];
- for i in 0..self.subbands {
- if quants[i] == 0 { continue; }
- let start = ATRAC3_SUBBANDS[i];
- let end = ATRAC3_SUBBANDS[i + 1];
- let scale = scalefactors[scf[i]] * ATRAC3_MAX_QUANT[quants[i]];
- read_coeffs(br, codebooks, &mut self.data[start..end], quants[i], scale, mode0)?;
- }
-
- for i in 0..self.ntones {
- let tone = &self.tones[i];
- for j in 0..tone.ncoeffs {
- self.data[tone.pos + j] += tone.coeffs[j];
- }
- }
- Ok(())
- }
- fn synth(&mut self, dsp: &mut DSP) {
- let mut flag = 0;
- let mut band = 0;
- for (data, delay) in self.data.chunks_mut(256).zip(self.delay.chunks_mut(256)) {
- if (flag & 1) != 0 {
- for i in 0..128 {
- let t0 = data[i];
- let t1 = data[255 - i];
- data[i] = t1;
- data[255 - i] = t0;
- }
- }
- dsp.synth_band(data);
- dsp.apply_gains(data, delay, &mut self.gain_data, self.block_no, band);
- delay.copy_from_slice(&dsp.tmp[256..512]);
- flag ^= 1;
- band += 1;
- }
- self.block_no ^= 1;
- }
- fn do_qmf(&mut self, dsp: &mut DSP, dst: &mut [f32]) {
- let mut qchunks = self.qmf_delay.chunks_mut(64);
- let qmf0 = qchunks.next().unwrap();
- let qmf1 = qchunks.next().unwrap();
- let qmf2 = qchunks.next().unwrap();
- {
- let mut tchunks = self.data.chunks_mut(512);
- let tmp0 = tchunks.next().unwrap();
- let tmp1 = tchunks.next().unwrap();
- dsp.do_qmf(tmp0, qmf0, false);
- dsp.do_qmf(tmp1, qmf1, true);
- }
- dsp.do_qmf_out(dst, &self.data, qmf2);
- }
-}
-
-const ATRAC3_DEFAULT_DELAY: usize = 2190;
-const ATRAC3_WEIGHTING_DELAYS: [u8; 6] = [ 0, 7, 0, 7, 0, 7 ];
-
-fn read_coeffs(br: &mut BitReader, cb: &[Codebook<u8>; 7], dst: &mut [f32], quant: usize, scale: f32, mode0: bool) -> DecoderResult<()> {
- if mode0 {
- read_coeffs_mode0(br, dst, quant, scale)
- } else if quant == 1 {
- read_coeffs_mode1(br, &cb[0], dst, scale)
- } else {
- read_coeffs_other(br, &cb[quant - 1], dst, scale)
- }
-}
-
-const ATRAC3_MODE0_CB: [f32; 4] = [ 0.0, 1.0, -2.0, -1.0 ];
-const ATRAC3_MODE0_BITS: [u8; 8] = [ 0, 4, 3, 3, 4, 4, 5, 6 ];
-
-fn read_coeffs_mode0(br: &mut BitReader, dst: &mut [f32], quant: usize, scale: f32) -> DecoderResult<()> {
- let bits = ATRAC3_MODE0_BITS[quant];
- if bits > 0 {
- for i in 0..dst.len() {
- let val = br.read_s(bits)? as f32;
- dst[i] = val * scale;
- }
- } else {
- for i in (0..dst.len()).step_by(2) {
- let val = br.read(4)? as usize;
- dst[i + 0] = ATRAC3_MODE0_CB[val >> 2] * scale;
- dst[i + 1] = ATRAC3_MODE0_CB[val & 3] * scale;
- }
- }
- Ok(())
-}
-
-const ATRAC3_MODE1_CB: [f32; 9 * 2] = [
- 0.0, 0.0,
- 0.0, 1.0,
- 0.0, -1.0,
- 1.0, 0.0,
- -1.0, 0.0,
- 1.0, 1.0,
- 1.0, -1.0,
- -1.0, 1.0,
- -1.0, -1.0
-];
-
-fn read_coeffs_mode1(br: &mut BitReader, cb: &Codebook<u8>, dst: &mut [f32], scale: f32) -> DecoderResult<()> {
- for i in (0..dst.len()).step_by(2) {
- let val = br.read_cb(cb)? as usize;
- dst[i + 0] = ATRAC3_MODE1_CB[val * 2 + 0] * scale;
- dst[i + 1] = ATRAC3_MODE1_CB[val * 2 + 1] * scale;
- }
- Ok(())
-}
-
-fn read_coeffs_other(br: &mut BitReader, cb: &Codebook<u8>, dst: &mut [f32], scale: f32) -> DecoderResult<()> {
- for i in 0..dst.len() {
- let val = (br.read_cb(cb)? as i8) + 1;
- let sign = (val & 1) != 0;
- let coef = (if sign { -(val >> 1) } else { val >> 1 }) as f32;
- dst[i] = coef * scale;
- }
- Ok(())
-}
-
-struct DSP {
- imdct: IMDCT,
- window: [f32; 512],
- gain_tab: [f32; 16],
- gain_tab2: [f32; 32],
- tmp: [f32; ATRAC3_FRAME_SIZE + 64],
-}
-
-impl DSP {
- fn new() -> Self {
- let mut gain_tab: [f32; 16] = [0.0; 16];
- let mut gain_tab2: [f32; 32] = [0.0; 32];
-
- for i in 0..16 {
- gain_tab[i] = 2.0f32.powf(4.0 - (i as f32));
- }
- for i in 0..32 {
- gain_tab2[i] = 2.0f32.powf(((i as f32) - 15.0) * -0.125);
- }
-
- let mut tmpw: [f32; 256] = [0.0; 256];
- for i in 0..tmpw.len() {
- tmpw[i] = (((((i as f32) + 0.5) / 256.0 - 0.5) * consts::PI).sin() + 1.0) * 0.5;
- }
-
- let mut window: [f32; 512] = [0.0; 512];
- for i in 0..tmpw.len() {
- let w = tmpw[i] / (tmpw[i] * tmpw[i] + tmpw[255 - i] * tmpw[255 - i]);
- window[i] = w;
- window[512 - 1 - i] = w;
- }
-
- Self {
- imdct: IMDCT::new(FFTMode::SplitRadix, 512, false),
- tmp: [0.0; ATRAC3_FRAME_SIZE + 64],
- gain_tab, gain_tab2, window,
- }
- }
- fn synth_band(&mut self, src: &[f32]) {
- let dst = &mut self.tmp;
- self.imdct.imdct(src, dst);
- for i in 0..512 {
- dst[i] *= self.window[i];
- }
- }
- fn apply_gains(&mut self, dst: &mut [f32], delay: &[f32], gain_data: &mut [GainData; 2], block_no: usize, band: usize) {
- let prev_ngains = gain_data[block_no ^ 1].ngains[band];
- let gain1 = if gain_data[block_no].ngains[band] > 0 {
- self.gain_tab[gain_data[block_no].gain_lev[band][0]]
- } else { 1.0 };
-
- if prev_ngains == 0 {
- for i in 0..256 {
- dst[i] = self.tmp[i] * gain1 + delay[i];
- }
- return;
- }
-
- gain_data[block_no ^ 1].gain_lev[band][prev_ngains] = 4;
- gain_data[block_no ^ 1].gain_loc[band][prev_ngains] = 32;
-
- let mut off = 0;
- for i in 0..prev_ngains {
- let start = gain_data[block_no ^ 1].gain_loc[band][i] * 8;
- let end = start + 8;
-
- let mut gain2 = self.gain_tab [gain_data[block_no ^ 1].gain_lev[band][i]];
- let gain_inc = self.gain_tab2[gain_data[block_no ^ 1].gain_lev[band][i + 1] + 15 -
- gain_data[block_no ^ 1].gain_lev[band][i]];
-
- while off < start {
- dst[off] = (self.tmp[off] * gain1 + delay[off]) * gain2;
- off += 1;
- }
- while off < end {
- dst[off] = (self.tmp[off] * gain1 + delay[off]) * gain2;
- gain2 *= gain_inc;
- off += 1;
- }
- }
- for i in off..256 {
- dst[i] = self.tmp[i] * gain1 + delay[i];
- }
- }
- fn qmf_prepare(&mut self, src: &[f32], delay: &[f32], size: usize, swap: bool) {
- for i in 0..46 {
- self.tmp[i] = delay[i];
- }
- let (s0, s1) = if !swap {
- (&src[0..], &src[size/2..])
- } else {
- (&src[size/2..], &src[0..])
- };
- for i in (0..size).step_by(4) {
- self.tmp[46 + i + 0] = s0[i / 2 + 0] + s1[i / 2 + 0];
- self.tmp[46 + i + 1] = s0[i / 2 + 0] - s1[i / 2 + 0];
- self.tmp[46 + i + 2] = s0[i / 2 + 1] + s1[i / 2 + 1];
- self.tmp[46 + i + 3] = s0[i / 2 + 1] - s1[i / 2 + 1];
- }
- }
- fn qmf_synth(&mut self, dst: &mut [f32], size: usize) {
- for i in (0..size).step_by(2) {
- let mut acc0 = 0.0;
- let mut acc1 = 0.0;
-
- for j in (0..ATRAC3_QMF_FILTER.len()).step_by(2) {
- acc0 += self.tmp[i + j + 0] * ATRAC3_QMF_FILTER[j + 0];
- acc1 += self.tmp[i + j + 1] * ATRAC3_QMF_FILTER[j + 1];
- }
- dst[i + 0] = acc1 * consts::SQRT_2 / 256.0;
- dst[i + 1] = acc0 * consts::SQRT_2 / 256.0;
- }
- }
- fn do_qmf(&mut self, dst: &mut [f32], delay: &mut [f32], swap: bool) {
- self.qmf_prepare(dst, delay, 512, swap);
- self.qmf_synth(dst, 512);
- for i in 0..46 {
- delay[i] = self.tmp[512 + i];
- }
- }
- fn do_qmf_out(&mut self, dst: &mut [f32], src: &[f32], delay: &mut [f32]) {
- self.qmf_prepare(src, delay, 1024, false);
- self.qmf_synth(dst, 1024);
- for i in 0..46 {
- delay[i] = self.tmp[1024 + i];
- }
- }
-}
-
-struct Atrac3Decoder {
- info: Rc<NACodecInfo>,
- channels: usize,
- chmap: NAChannelMap,
- samples: usize,
- mode: Mode,
- scrambled: bool,
-
- codebooks: [Codebook<u8>; 7],
- dsp: DSP,
- ch_data: [Channel; 2],
- scalefactors: [f32; 64],
-
- mci_prev: [usize; 4],
- mci_cur: [usize; 4],
- mci_next: [usize; 4],
-
- weighting_delay: [u8; 6],
-
- pkt_buf: Vec<u8>,
-}
-
-struct Atrac3CodebookReader {
- bits: &'static [u8],
- codes: &'static [u8],
-}
-impl CodebookDescReader<u8> for Atrac3CodebookReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
- fn len(&mut self) -> usize { self.bits.len() }
-}
-
-impl Atrac3Decoder {
- fn new() -> Self {
- let mut scalefactors: [f32; 64] = [0.0; 64];
- for i in 0..scalefactors.len() {
- scalefactors[i] = 2.0f32.powf(((i as f32) - 15.0) / 3.0);
- }
-
- let mut cb0 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[0], bits: ATRAC3_HUFF_BITS[0] };
- let mut cb1 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[1], bits: ATRAC3_HUFF_BITS[1] };
- let mut cb2 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[2], bits: ATRAC3_HUFF_BITS[2] };
- let mut cb3 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[3], bits: ATRAC3_HUFF_BITS[3] };
- let mut cb4 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[4], bits: ATRAC3_HUFF_BITS[4] };
- let mut cb5 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[5], bits: ATRAC3_HUFF_BITS[5] };
- let mut cb6 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[6], bits: ATRAC3_HUFF_BITS[6] };
- Self {
- info: NACodecInfo::new_dummy(),
- chmap: NAChannelMap::new(),
- channels: 0,
- samples: 0,
- mode: Mode::Mono,
- scrambled: false,
-
- dsp: DSP::new(),
- ch_data: [Channel::new(), Channel::new()],
- codebooks: [Codebook::new(&mut cb0, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb1, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb2, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb3, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb4, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb5, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb6, CodebookMode::MSB).unwrap() ],
-
- mci_prev: [3; 4],
- mci_cur: [3; 4],
- mci_next: [3; 4],
-
- weighting_delay: ATRAC3_WEIGHTING_DELAYS,
- pkt_buf: Vec::with_capacity(65536),
- scalefactors,
- }
- }
- fn rev_matrix(&mut self) {
- for i in 0..4 {
- let c0 = self.mci_prev[i];
- let c1 = self.mci_cur[i];
- let off;
- if c0 != c1 {
- let l0 = ATRAC3_MATRIX_COEFFS[c0 * 2 + 0];
- let r0 = ATRAC3_MATRIX_COEFFS[c1 * 2 + 0];
- let l1 = ATRAC3_MATRIX_COEFFS[c0 * 2 + 1];
- let r1 = ATRAC3_MATRIX_COEFFS[c1 * 2 + 1];
- for idx in 0..8 {
- let t0 = self.ch_data[0].data[idx + i * 256];
- let t1 = self.ch_data[1].data[idx + i * 256];
- let n1 = t0 * interp(l0, r0, idx) + t1 * interp(l1, r1, idx);
- self.ch_data[0].data[idx + i * 256] = n1;
- self.ch_data[1].data[idx + i * 256] = t0 * 2.0 - n1;
- }
- off = i * 256 + 8;
- } else {
- off = i * 256;
- }
- match c1 {
- 0 => {
- for i in off..256 {
- let t0 = self.ch_data[0].data[i];
- let t1 = self.ch_data[1].data[i];
- self.ch_data[0].data[i] = t1 * 2.0;
- self.ch_data[1].data[i] = (t0 - t1) * 2.0;
- }
- },
- 1 => {
- for i in off..256 {
- let t0 = self.ch_data[0].data[i];
- let t1 = self.ch_data[1].data[i];
- self.ch_data[0].data[i] = (t0 + t1) * 2.0;
- self.ch_data[1].data[i] = t1 * -2.0;
- }
- },
- _ => {
- for i in off..256 {
- let t0 = self.ch_data[0].data[i];
- let t1 = self.ch_data[1].data[i];
- self.ch_data[0].data[i] = t0 + t1;
- self.ch_data[1].data[i] = t0 - t1;
- }
- },
- };
- }
- }
- fn weigh_channels(&mut self) {
- if (self.weighting_delay[1] == 7) && (self.weighting_delay[3] == 7) { return; }
- let pw: [f32; 2];
- if self.weighting_delay[1] == 7 {
- pw = [1.0; 2];
- } else {
- let w = (self.weighting_delay[1] as f32) / 7.0;
- let iw = (2.0 - w * w).sqrt();
- if self.weighting_delay[0] == 0 {
- pw = [w, iw];
- } else {
- pw = [iw, w];
- }
- }
- let cw: [f32; 2];
- if self.weighting_delay[3] == 7 {
- cw = [1.0; 2];
- } else {
- let w = (self.weighting_delay[3] as f32) / 7.0;
- let iw = (2.0 - w * w).sqrt();
- if self.weighting_delay[2] == 0 {
- cw = [w, iw];
- } else {
- cw = [iw, w];
- }
- }
-
- for i in 0..4 {
- let off = i * 256;
- for j in 0..8 {
- self.ch_data[0].data[off + j] *= interp(pw[0], pw[1], j);
- self.ch_data[1].data[off + j] *= interp(pw[0], pw[1], j);
- }
- for j in 8..256 {
- self.ch_data[0].data[off + j] *= cw[0];
- self.ch_data[1].data[off + j] *= cw[1];
- }
- }
- }
-}
-
-fn interp(a: f32, b: f32, pos: usize) -> f32 {
- a + ((pos as f32) / 8.0) * (b - a)
-}
-
-impl NADecoder for Atrac3Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- self.info = info.clone();
- let edata = info.get_extradata().unwrap();
- validate!(edata.len() >= 4);
-
- let mut mr = MemoryReader::new_read(&edata);
- let mut br = ByteReader::new(&mut mr);
-
- match edata.len() {
- 10 => {
- let version = br.read_u32be()?;
- validate!(version == 4);
- self.samples = br.read_u16be()? as usize;
- let delay = br.read_u16be()? as usize;
- validate!(delay == ATRAC3_DEFAULT_DELAY);
- let mode = br.read_u16be()?;
- self.mode = match mode {
- 0 => Mode::Mono,
- 2 => Mode::Stereo,
- 0x12 => Mode::JointStereo,
- _ => return Err(DecoderError::InvalidData),
- };
- self.channels = if self.mode == Mode::Mono { 1 } else { 2 };
- self.scrambled = true;
- },
- 14 | 16 => {
- if edata.len() == 16 { br.read_skip(2)?; }
- self.samples = br.read_u32be()? as usize;
- let mode = br.read_u16be()?;
- self.mode = if mode != 0 { Mode::JointStereo } else { Mode::Stereo };
- self.channels = 2;
- br.read_skip(2)?;
- let ffactor = br.read_u16be()? as usize;
- validate!((ffactor > 0) && (ffactor <= 16));
- // calculate block_align / channels / ffactor, validate it's 96/152/192
- },
- _ => { return Err(DecoderError::InvalidData) }
- };
- validate!(self.samples == ATRAC3_FRAME_SIZE * self.channels);
- if self.mode == Mode::Mono {
- self.chmap.add_channel(NAChannelType::C);
- } else {
- self.chmap.add_channel(NAChannelType::L);
- self.chmap.add_channel(NAChannelType::R);
- }
- let ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), self.channels as u8,
- SND_F32P_FORMAT, self.samples);
- self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo));
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- validate!(pktbuf.len() > 5);
-
- let frame_size = pktbuf.len();
- self.pkt_buf.resize(frame_size, 0);
- if self.scrambled {
- for (i, s) in pktbuf.iter().enumerate() {
- self.pkt_buf[i] = s ^ ATRAC3_XOR_KEY[i & 3];
- }
- } else {
- let dst = &mut self.pkt_buf[0..frame_size];
- dst.copy_from_slice(pktbuf.as_slice());
- }
-
- {
- let mut br = BitReader::new(self.pkt_buf.as_slice(), frame_size, BitReaderMode::BE);
- let id = br.read(6)?;
- validate!(id == 0x28);
- self.ch_data[0].decode_unit(&mut br, &self.codebooks, &self.scalefactors)?;
- self.ch_data[0].synth(&mut self.dsp);
- }
- if self.channels == 2 {
- let off;
- if self.mode == Mode::JointStereo {
- for i in 0..frame_size / 2 {
- let b0 = self.pkt_buf[i];
- let b1 = self.pkt_buf[frame_size - i - 1];
- self.pkt_buf[i] = b1;
- self.pkt_buf[frame_size - i - 1] = b0;
- }
- let mut i = 0;
- while (i < frame_size) && (self.pkt_buf[i] == 0xF8) { i += 1; }
- validate!(frame_size - i > 4);
- off = i;
- } else {
- off = frame_size / 2;
- }
- let mut br = BitReader::new(&self.pkt_buf[off..], frame_size - off, BitReaderMode::BE);
- if self.mode == Mode::JointStereo {
- let id = br.read(2)?;
- validate!(id == 0x3);
- } else {
- let id = br.read(6)?;
- validate!(id == 0x28);
- }
- if self.mode == Mode::JointStereo {
- for i in 0..self.weighting_delay.len() - 2 {
- self.weighting_delay[i] = self.weighting_delay[i + 2];
- }
- self.weighting_delay[4] = br.read(1)? as u8;
- self.weighting_delay[5] = br.read(3)? as u8;
- self.mci_prev = self.mci_cur;
- self.mci_cur = self.mci_next;
- for i in 0..4 {
- self.mci_next[i] = br.read(2)? as usize;
- }
- }
- self.ch_data[1].decode_unit(&mut br, &self.codebooks, &self.scalefactors)?;
- self.ch_data[1].synth(&mut self.dsp);
- }
- if self.mode == Mode::JointStereo {
- self.rev_matrix();
- self.weigh_channels();
- }
-
- let ainfo = self.info.get_properties().get_audio_info().unwrap();
-
- let mut abuf = alloc_audio_buffer(ainfo, ATRAC3_FRAME_SIZE, self.chmap.clone())?;
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut output = adata.get_data_mut();
-
- for ch in 0..self.channels {
- let dpos = abuf.get_offset(ch);
- self.ch_data[ch].do_qmf(&mut self.dsp, &mut output[dpos..][..ATRAC3_FRAME_SIZE]);
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(Atrac3Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_atrac3() {
- let file = "assets/RV/rv30_atrc_384x208_realproducer_plus_8.51.rm";
-// let file = "assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm";
- test_decode_audio("realmedia", file, Some(12000), "atrac3");
- }
-}
-
-const ATRAC3_XOR_KEY: [u8; 4] = [ 0x53, 0x7F, 0x61, 0x03 ];
-
-const ATRAC3_HUFF_CODES: [&[u8]; 7] = [
- &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x1C, 0x1D, 0x1E, 0x1F ],
- &[ 0x00, 0x04, 0x05, 0x06, 0x07 ],
- &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x0E, 0x0F ],
- &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x1C, 0x1D, 0x1E, 0x1F ], // same as 0
- &[ 0x00, 0x02, 0x03, 0x08, 0x09, 0x0A, 0x0B, 0x1C, 0x1D, 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x0D ],
- &[ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x14,
- 0x15, 0x16, 0x17, 0x18, 0x19, 0x34, 0x35, 0x36,
- 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x78, 0x79, 0x7A,
- 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x08, 0x09 ],
- &[ 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
- 0x0F, 0x10, 0x11, 0x24, 0x25, 0x26, 0x27, 0x28,
- 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
- 0x31, 0x32, 0x33, 0x68, 0x69, 0x6A, 0x6B, 0x6C,
- 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
- 0x75, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2,
- 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
- 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x02, 0x03 ]
-];
-const ATRAC3_HUFF_BITS: [&[u8]; 7] = [
- &[ 1, 3, 3, 4, 4, 5, 5, 5, 5 ],
- &[ 1, 3, 3, 3, 3 ],
- &[ 1, 3, 3, 4, 4, 4, 4 ],
- &[ 1, 3, 3, 4, 4, 5, 5, 5, 5 ],
- &[ 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 4, 4 ],
- &[ 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4 ],
- &[ 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4 ],
-];
-
-const ATRAC3_MAX_QUANT: [f32; 8] = [ 0.0, 1.0/1.5, 1.0/2.5, 1.0/3.5, 1.0/4.5, 1.0/7.5, 1.0/15.5, 1.0/31.5 ];
-
-const ATRAC3_SUBBANDS: [usize; 32 + 1] = [
- 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176,
- 192, 224, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896,
- 1024
-];
-
-const ATRAC3_MATRIX_COEFFS: [f32; 8] = [ 0.0, 2.0, 2.0, 2.0, 0.0, 0.0, 1.0, 1.0 ];
-
-const ATRAC3_QMF_FILTER: [f32; 48] = [
- -0.000029238139, -0.000184109580, -0.000112315138, 0.000602345390,
- 0.000484503806, -0.001705877949, -0.001041114796, 0.004068033770,
- 0.001566677820, -0.008430772461, -0.001512299757, 0.015680588782,
- -0.000122339843, -0.026883240789, 0.004925364163, 0.043472178280,
- -0.015603342094, -0.068180441856, 0.037618979812, 0.108652018011,
- -0.087192758918, -0.198768734932, 0.264158189297, 0.928483188152,
- 0.928483188152, 0.264158189297, -0.198768734932, -0.087192758918,
- 0.108652018011, 0.037618979812, -0.068180441856, -0.015603342094,
- 0.043472178280, 0.004925364163, -0.026883240789, -0.000122339843,
- 0.015680588782, -0.001512299757, -0.008430772461, 0.001566677820,
- 0.004068033770, -0.001041114796, -0.001705877949, 0.000484503806,
- 0.000602345390, -0.000112315138, -0.000184109580, -0.000029238139
-];
diff --git a/nihav-core/src/codecs/clearvideo.rs b/nihav-core/src/codecs/clearvideo.rs
deleted file mode 100644
index 8a27006..0000000
--- a/nihav-core/src/codecs/clearvideo.rs
+++ /dev/null
@@ -1,2570 +0,0 @@
-use crate::io::byteio::{ByteReader,MemoryReader};
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use crate::formats;
-use super::*;
-use std::fmt;
-use std::ops::{Add, Sub};
-
-struct CLVDCCodeReader { }
-struct CLVACCodeReader { }
-struct CLVFlagsCodeReader { codes: &'static [u16], bits: &'static [u8] }
-struct CLVSym16CodeReader { codes: &'static [u16], bits: &'static [u8], syms: &'static [u16] }
-
-impl CodebookDescReader<i8> for CLVDCCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { CLV_DC_BITS[idx] }
- fn code(&mut self, idx: usize) -> u32 { CLV_DC_CODES[idx] as u32 }
- fn sym (&mut self, idx: usize) -> i8 { (idx as i8) - 63 }
- fn len(&mut self) -> usize { CLV_DC_BITS.len() }
-}
-
-impl CodebookDescReader<u16> for CLVACCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { CLV_AC_BITS[idx] }
- fn code(&mut self, idx: usize) -> u32 { CLV_AC_CODES[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u16 { CLV_AC_SYMS[idx] }
- fn len(&mut self) -> usize { CLV_AC_BITS.len() }
-}
-
-impl CodebookDescReader<u8> for CLVFlagsCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
- fn len(&mut self) -> usize { self.bits.len() }
-}
-
-impl CodebookDescReader<u16> for CLVSym16CodeReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u16 { self.syms[idx] }
- fn len(&mut self) -> usize { self.bits.len() }
-}
-
-#[allow(dead_code)]
-struct LevelCodes {
- flags_cb: Option<Codebook<u8>>,
- mv_cb: Option<Codebook<u16>>,
- mv_esc: u16,
- bias_cb: Option<Codebook<u16>>,
- bias_esc: u16,
-}
-
-impl LevelCodes {
- fn new(flgd: Option<(&'static [u8], &'static [u16])>,
- mvd: Option<(&'static [u8], &'static [u16], &'static [u16])>, mv_esc: u16,
- bias: Option<(&'static [u8], &'static [u16], &'static [u16])>, bias_esc: u16) -> Self {
- let flags_cb = if let Some((bits, codes)) = flgd {
- let mut coderead = CLVFlagsCodeReader { bits: bits, codes: codes };
- Some(Codebook::new(&mut coderead, CodebookMode::MSB).unwrap())
- } else {
- None
- };
- let mv_cb = if let Some((bits, codes, syms)) = mvd {
- let mut coderead = CLVSym16CodeReader { bits: bits, codes: codes, syms: syms };
- Some(Codebook::new(&mut coderead, CodebookMode::MSB).unwrap())
- } else {
- None
- };
- let bias_cb = if let Some((bits, codes, syms)) = bias {
- let mut coderead = CLVSym16CodeReader { bits: bits, codes: codes, syms: syms };
- Some(Codebook::new(&mut coderead, CodebookMode::MSB).unwrap())
- } else {
- None
- };
- LevelCodes { flags_cb: flags_cb, mv_cb: mv_cb, mv_esc: mv_esc, bias_cb: bias_cb, bias_esc: bias_esc }
- }
-}
-
-#[derive(Debug,Clone,Copy)]
-pub struct MV {
- x: i16,
- y: i16,
-}
-
-impl MV {
- pub fn new(x: i16, y: i16) -> Self { MV{ x: x, y: y } }
- pub fn pred(a: MV, b: MV, c: MV) -> Self {
- let x;
- if a.x < b.x {
- if b.x < c.x {
- x = b.x;
- } else {
- if a.x < c.x { x = c.x; } else { x = a.x; }
- }
- } else {
- if b.x < c.x {
- if a.x < c.x { x = a.x; } else { x = c.x; }
- } else {
- x = b.x;
- }
- }
- let y;
- if a.y < b.y {
- if b.y < c.y {
- y = b.y;
- } else {
- if a.y < c.y { y = c.y; } else { y = a.y; }
- }
- } else {
- if b.y < c.y {
- if a.y < c.y { y = a.y; } else { y = c.y; }
- } else {
- y = b.y;
- }
- }
- MV { x: x, y: y }
- }
-}
-
-pub const ZERO_MV: MV = MV { x: 0, y: 0 };
-
-impl Add for MV {
- type Output = MV;
- fn add(self, other: MV) -> MV { MV { x: self.x + other.x, y: self.y + other.y } }
-}
-
-impl Sub for MV {
- type Output = MV;
- fn sub(self, other: MV) -> MV { MV { x: self.x - other.x, y: self.y - other.y } }
-}
-
-impl fmt::Display for MV {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{},{}", self.x, self.y)
- }
-}
-
-struct MVInfo {
- mv: Vec<MV>,
- mb_w: usize,
- mb_h: usize,
- mb_size: usize,
- mb_stride: usize,
- top: bool,
-}
-
-impl MVInfo {
- fn new() -> Self { MVInfo{ mv: Vec::new(), mb_w: 0, mb_h: 0, mb_size: 0, mb_stride: 0, top: true } }
- fn reset(&mut self, mb_w: usize, mb_h: usize, mb_size: usize) {
- self.mb_w = mb_w;
- self.mb_h = mb_h;
- self.mb_size = mb_size;
- self.mb_stride = mb_w;
- self.mv.resize(self.mb_stride * 2, ZERO_MV);
- }
- fn update_row(&mut self) {
- self.top = false;
- for i in 0..self.mb_stride {
- self.mv[i] = self.mv[self.mb_stride + i];
- }
- }
- #[allow(non_snake_case)]
- fn predict(&mut self, mb_x: usize, mb_y: usize, diff: MV) -> MV {
- let pred_mv = if self.top {
- if mb_x > 0 { self.mv[self.mb_stride + mb_x - 1] } else { ZERO_MV }
- } else if (mb_x == 0) || (mb_x == self.mb_w - 1) {
- self.mv[mb_x]
- } else {
- let A = self.mv[self.mb_stride + mb_x - 1];
- let B = self.mv[ mb_x];
- let C = self.mv[ mb_x + 1];
- MV::pred(A, B, C)
- };
- let mut res = pred_mv;
-
- let left_mv = -((mb_x * self.mb_size) as i16);
- let right_mv = ((self.mb_w - mb_x - 1) * self.mb_size) as i16;
- if res.x < left_mv { res.x = left_mv; }
- if res.x > right_mv { res.x = right_mv; }
- let top_mv = -((mb_y * self.mb_size) as i16);
- let bot_mv = ((self.mb_h - mb_y - 1) * self.mb_size) as i16;
- if res.y < top_mv { res.y = top_mv; }
- if res.y > bot_mv { res.y = bot_mv; }
-
- self.mv[self.mb_stride + mb_x] = res + diff;
-
- res
- }
-}
-
-
-struct TileInfo {
- flags: u8,
- mv: MV,
- bias: i16,
- child: [Option<Box<TileInfo>>; 4],
-}
-
-#[allow(non_snake_case)]
-fn dct_row(blk: &mut [i32]) {
- let dshift = 11;
- let shift = 8;
- let t0 = 2841 * blk[1] + 565 * blk[7];
- let t1 = 565 * blk[1] - 2841 * blk[7];
- let t2 = 1609 * blk[5] + 2408 * blk[3];
- let t3 = 2408 * blk[5] - 1609 * blk[3];
- let t4 = 1108 * blk[2] - 2676 * blk[6];
- let t5 = 2676 * blk[2] + 1108 * blk[6];
- let t6 = ((blk[0] + blk[4]) << dshift) + (1 << (shift - 1));
- let t7 = ((blk[0] - blk[4]) << dshift) + (1 << (shift - 1));
- let t8 = t0 + t2;
- let t9 = t0 - t2;
- let tA = 181 * (t9 + (t1 - t3)) + 0x80 >> 8;
- let tB = 181 * (t9 - (t1 - t3)) + 0x80 >> 8;
- let tC = t1 + t3;
-
- blk[0] = (t6 + t5 + t8) >> shift;
- blk[1] = (t7 + t4 + tA) >> shift;
- blk[2] = (t7 - t4 + tB) >> shift;
- blk[3] = (t6 - t5 + tC) >> shift;
- blk[4] = (t6 - t5 - tC) >> shift;
- blk[5] = (t7 - t4 - tB) >> shift;
- blk[6] = (t7 + t4 - tA) >> shift;
- blk[7] = (t6 + t5 - t8) >> shift;
-}
-
-#[allow(non_snake_case)]
-fn dct_col(blk: &mut [i32; 64], col: usize) {
- let dshift = 8;
- let shift = 14;
- let t0 = (2841 * blk[1*8 + col] + 565 * blk[7*8 + col] + 4) >> 3;
- let t1 = ( 565 * blk[1*8 + col] - 2841 * blk[7*8 + col] + 4) >> 3;
- let t2 = (1609 * blk[5*8 + col] + 2408 * blk[3*8 + col] + 4) >> 3;
- let t3 = (2408 * blk[5*8 + col] - 1609 * blk[3*8 + col] + 4) >> 3;
- let t4 = (1108 * blk[2*8 + col] - 2676 * blk[6*8 + col] + 4) >> 3;
- let t5 = (2676 * blk[2*8 + col] + 1108 * blk[6*8 + col] + 4) >> 3;
- let t6 = ((blk[0*8 + col] + blk[4*8 + col]) << dshift) + (1 << (shift - 1));
- let t7 = ((blk[0*8 + col] - blk[4*8 + col]) << dshift) + (1 << (shift - 1));
- let t8 = t0 + t2;
- let t9 = t0 - t2;
- let tA = 181 * (t9 + (t1 - t3)) + 0x80 >> 8;
- let tB = 181 * (t9 - (t1 - t3)) + 0x80 >> 8;
- let tC = t1 + t3;
-
- blk[0*8 + col] = (t6 + t5 + t8) >> shift;
- blk[1*8 + col] = (t7 + t4 + tA) >> shift;
- blk[2*8 + col] = (t7 - t4 + tB) >> shift;
- blk[3*8 + col] = (t6 - t5 + tC) >> shift;
- blk[4*8 + col] = (t6 - t5 - tC) >> shift;
- blk[5*8 + col] = (t7 - t4 - tB) >> shift;
- blk[6*8 + col] = (t7 + t4 - tA) >> shift;
- blk[7*8 + col] = (t6 + t5 - t8) >> shift;
-}
-
-fn clv_dct(blk: &mut [i32; 64]) {
- for row in blk.chunks_mut(8) { dct_row(row); }
- for i in 0..8 { dct_col(blk, i); }
-}
-
-fn clv_dct_dc(blk: &mut [i32; 64]) {
- let dval = blk[0] >> 3;
- for i in 0..64 { blk[i] = dval; }
-}
-
-fn put_blocks(buf: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize, blk: &[[i32;64]; 6]) {
- let stridey = buf.get_stride(0);
- let strideu = buf.get_stride(1);
- let stridev = buf.get_stride(2);
- let mut idxy = buf.get_offset(0) + xpos * 16 + ypos * 16 * stridey;
- let mut idxu = buf.get_offset(1) + xpos * 8 + ypos * 8 * strideu;
- let mut idxv = buf.get_offset(2) + xpos * 8 + ypos * 8 * stridev;
-
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[0][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[1][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k + 8] = v as u8;
- }
- idxy += stridey;
- }
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[2][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[3][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k + 8] = v as u8;
- }
- idxy += stridey;
- }
-
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[4][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxu + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[5][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxv + k] = v as u8;
- }
- idxu += strideu;
- idxv += stridev;
- }
-}
-
-fn copy_block(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>,
- plane: usize, x: usize, y: usize, dx: isize, dy: isize, size: usize)
-{
- let sx: isize = (x as isize) + dx;
- let sy: isize = (y as isize) + dy;
-
- let sstride = src.get_stride(plane);
- let mut soff = src.get_offset(plane) + (sx as usize) + (sy as usize) * sstride;
- let sdta = src.get_data();
- let sbuf: &[u8] = sdta.as_slice();
- let dstride = dst.get_stride(plane);
- let mut doff = dst.get_offset(plane) + x + y * dstride;
- let mut ddta = dst.get_data_mut();
- let dbuf: &mut [u8] = ddta.as_mut_slice();
- for _ in 0..size {
- let dst = &mut dbuf[doff..][..size];
- let src = &sbuf[soff..][..size];
- dst.copy_from_slice(src);
- doff += dstride;
- soff += sstride;
- }
-}
-
-fn copyadd_block(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>,
- plane: usize, x: usize, y: usize, dx: isize, dy: isize, size: usize, bias: i16)
-{
- let sx: isize = (x as isize) + dx;
- let sy: isize = (y as isize) + dy;
-
- let sstride = src.get_stride(plane);
- let mut soff = src.get_offset(plane) + (sx as usize) + (sy as usize) * sstride;
- let sdta = src.get_data();
- let sbuf: &[u8] = sdta.as_slice();
- let dstride = dst.get_stride(plane);
- let mut doff = dst.get_offset(plane) + x + y * dstride;
- let mut ddta = dst.get_data_mut();
- let dbuf: &mut [u8] = ddta.as_mut_slice();
- for _ in 0..size {
- let dst = &mut dbuf[doff..][..size];
- let src = &sbuf[soff..][..size];
- for i in 0..size {
- let val = (src[i] as i16) + bias;
- if val < 0x00 { dst[i] = 0x00; }
- else if val > 0xFF { dst[i] = 0xFF; }
- else { dst[i] = val as u8; }
- }
- doff += dstride;
- soff += sstride;
- }
-}
-
-fn tile_do_block(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>,
- plane: usize, x: usize, y: usize, dx: i16, dy: i16, size: usize, bias: i16)
-{
- if bias == 0 {
- copy_block(dst, src, plane, x, y, dx as isize, dy as isize, size);
- } else {
- copyadd_block(dst, src, plane, x, y, dx as isize, dy as isize, size, bias);
- }
-}
-
-fn restore_tree(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, plane: usize,
- x: usize, y: usize, size: usize, tile: &TileInfo, root_mv: MV) {
- let mv = root_mv + tile.mv;
-
- if tile.flags == 0 {
- tile_do_block(dst, src, plane, x, y, mv.x, mv.y, size, tile.bias);
- } else {
- let hsize = size >> 1;
- for i in 0..4 {
- let xoff = if (i & 2) == 0 { 0 } else { hsize };
- let yoff = if (i & 1) == 0 { 0 } else { hsize };
-
- if let Some(ref subtile) = tile.child[i] {
- restore_tree(dst, src, plane, x + xoff, y + yoff, hsize, subtile, root_mv);
- } else {
- tile_do_block(dst, src, plane, x + xoff, y + yoff, mv.x, mv.y, hsize, tile.bias);
- }
- }
- }
-}
-
-fn extend_edges(buf: &mut NAVideoBuffer<u8>, tile_size: usize) {
- for comp in 0..3 {
- let (w, h) = buf.get_dimensions(comp);
- let size = if comp == 0 { tile_size } else { tile_size >> 1 };
- let stride = buf.get_stride(comp);
- let planeoff = buf.get_offset(comp);
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- let right = size - (w & (size - 1));
- let bottom = size - (h & (size - 1));
-
- if (right == size) && (bottom == size) { return; }
- if right != size {
- let mut off = planeoff + w;
- for _ in 0..h {
- for i in 0..right { framebuf[off + i] = 0x80; }
- off += stride;
- }
- }
- if bottom != size {
- let mut off = planeoff + h * stride;
- for _ in 0..bottom {
- for i in 0..stride { framebuf[off + i] = 0x80; }
- off += stride;
- }
- }
- }
-}
-
-#[allow(dead_code)]
-struct ClearVideoDecoder {
- info: Rc<NACodecInfo>,
- dc_cb: Codebook<i8>,
- ac_cb: Codebook<u16>,
- frmmgr: HAMShuffler,
- is_rm: bool,
- ylev: [LevelCodes; 4],
- ulev: [LevelCodes; 3],
- vlev: [LevelCodes; 3],
- tsize: u8,
-}
-
-fn decode_dct_block(br: &mut BitReader, blk: &mut [i32; 64], ac_quant: i32, has_ac: bool,
- dc_cb: &Codebook<i8>, ac_cb: &Codebook<u16>) -> DecoderResult<()> {
- let mut idx = 1;
- let mut eob = false;
-
- blk[0] = br.read_cb(dc_cb)? as i32;
-
- if !has_ac { return Ok(()); }
-
- while (idx < 64) && !eob {
- let val = br.read_cb(ac_cb)?;
- let (level, skip) = if val != CLV_AC_ESCAPE {
- eob = ((val >> 12) & 1) != 0;
- let run = ((val >> 4) & 0xFF) as usize;
- let lev = (val & 0xF) as i32;
- if br.read_bool()? {
- (-lev, run)
- } else {
- ( lev, run)
- }
- } else {
- eob = br.read_bool()?;
- let run = br.read(6)? as usize;
- let lev = br.read_s(8)? as i32;
- (lev, run)
- };
- idx += skip;
- validate!(idx < 64);
- if level != 0 {
- let (aval, sign) = if level >= 0 { (level, false) } else { (-level, true) };
- let mut val = ac_quant * (2 * aval + 1);
- if (ac_quant & 1) == 0 {
- val -= 1;
- }
- if sign {
- val = -val;
- }
- blk[ZIGZAG[idx]] = val;
- }
- idx += 1;
- }
-
- validate!(idx <= 64 && eob);
-
- Ok(())
-}
-
-fn decode_tile_info(br: &mut BitReader, lc: &[LevelCodes], level: usize) -> DecoderResult<Box<TileInfo>> {
- let flags = if let Some(ref cb) = lc[level].flags_cb {
- br.read_cb(cb)?
- } else {
- 0
- };
- let mv = if let Some(ref cb) = lc[level].mv_cb {
- let mv_code = br.read_cb(cb)?;
- if mv_code != lc[level].mv_esc {
- MV::new(((mv_code & 0xFF) as i8) as i16, (mv_code as i16) >> 8)
- } else {
- let x = br.read_s(8)? as i16;
- let y = br.read_s(8)? as i16;
- MV::new(x, y)
- }
- } else {
- ZERO_MV
- };
- let bias = if let Some(ref cb) = lc[level].bias_cb {
- let bias_val = br.read_cb(cb)?;
- if bias_val != lc[level].bias_esc {
- bias_val as i16
- } else {
- br.read_s(16)? as i16
- }
- } else {
- 0
- };
- let mut ti = TileInfo { flags: flags, mv: mv, bias: bias, child: [None, None, None, None] };
- if ti.flags != 0 {
- for i in 0..4 {
- if (ti.flags & (1 << i)) != 0 {
- let subti = decode_tile_info(br, lc, level + 1)?;
- ti.child[i] = Some(subti);
- }
- }
- }
- Ok(Box::new(ti))
-}
-
-impl ClearVideoDecoder {
- fn new(is_rm: bool) -> Self {
- let dummy_info = Rc::new(DUMMY_CODEC_INFO);
- let mut coderead = CLVDCCodeReader{};
- let dc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = CLVACCodeReader{};
- let ac_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
-
- ClearVideoDecoder {
- info: dummy_info,
- dc_cb: dc_cb, ac_cb: ac_cb,
- frmmgr: HAMShuffler::new(),
- is_rm: is_rm,
- ylev: [
- LevelCodes::new(Some((CLV_FLAGSY_0_BITS, CLV_FLAGSY_0_CODES)),
- Some((CLV_MVY_0_BITS, CLV_MVY_0_CODES, CLV_MVY_0_SYMS)), CLV_MVY_0_ESCAPE,
- None, 0),
- LevelCodes::new(Some((CLV_FLAGSY_1_BITS, CLV_FLAGSY_1_CODES)),
- Some((CLV_MVY_1_BITS, CLV_MVY_1_CODES, CLV_MVY_1_SYMS)), CLV_MVY_1_ESCAPE,
- Some((CLV_BIASY_1_BITS, CLV_BIASY_1_CODES, CLV_BIASY_1_SYMS)), CLV_BIAS_ESCAPE),
- LevelCodes::new(Some((CLV_FLAGSY_2_BITS, CLV_FLAGSY_2_CODES)),
- Some((CLV_MVY_2_BITS, CLV_MVY_2_CODES, CLV_MVY_2_SYMS)), CLV_MVY_2_ESCAPE,
- Some((CLV_BIASY_2_BITS, CLV_BIASY_2_CODES, CLV_BIASY_2_SYMS)), CLV_BIAS_ESCAPE),
- LevelCodes::new(None,
- Some((CLV_MVY_3_BITS, CLV_MVY_3_CODES, CLV_MVY_3_SYMS)), CLV_MVY_3_ESCAPE,
- Some((CLV_BIASY_3_BITS, CLV_BIASY_3_CODES, CLV_BIASY_3_SYMS)), CLV_BIAS_ESCAPE)
- ],
- ulev: [
- LevelCodes::new(Some((CLV_FLAGSU_0_BITS, CLV_FLAGSU_0_CODES)),
- None, 0,
- None, 0),
- LevelCodes::new(Some((CLV_FLAGSU_1_BITS, CLV_FLAGSU_1_CODES)),
- Some((CLV_MVU_1_BITS, CLV_MVU_1_CODES, CLV_MVU_1_SYMS)), CLV_MVU_1_ESCAPE,
- Some((CLV_BIASU_1_BITS, CLV_BIASU_1_CODES, CLV_BIASU_1_SYMS)), CLV_BIAS_ESCAPE),
- LevelCodes::new(None,
- Some((CLV_MVU_2_BITS, CLV_MVU_2_CODES, CLV_MVU_2_SYMS)), CLV_MVU_2_ESCAPE,
- Some((CLV_BIASU_2_BITS, CLV_BIASU_2_CODES, CLV_BIASU_2_SYMS)), CLV_BIAS_ESCAPE),
- ],
- vlev: [
- LevelCodes::new(Some((CLV_FLAGSV_0_BITS, CLV_FLAGSV_0_CODES)),
- None, 0,
- None, 0),
- LevelCodes::new(Some((CLV_FLAGSV_1_BITS, CLV_FLAGSV_1_CODES)),
- Some((CLV_MVV_1_BITS, CLV_MVV_1_CODES, CLV_MVV_1_SYMS)), CLV_MVV_1_ESCAPE,
- Some((CLV_BIASV_1_BITS, CLV_BIASV_1_CODES, CLV_BIASV_1_SYMS)), CLV_BIAS_ESCAPE),
- LevelCodes::new(None,
- Some((CLV_MVV_2_BITS, CLV_MVV_2_CODES, CLV_MVV_2_SYMS)), CLV_MVV_2_ESCAPE,
- Some((CLV_BIASV_2_BITS, CLV_BIASV_2_CODES, CLV_BIASV_2_SYMS)), CLV_BIAS_ESCAPE),
- ],
- tsize: 0,
- }
- }
-
- fn decode_frame_intra(&mut self, br: &mut BitReader, buf: &mut NAVideoBuffer<u8>,
- width: usize, height: usize) -> DecoderResult<()> {
- let ac_quant = br.read(8)? as i32;
-
- let mut top_dc: [i32; 3] = [0; 3];
- let mut left_dc: [i32; 4] = [0; 4];
-
- let mb_w = (width + 0xF) >> 4;
- let mb_h = (height + 0xF) >> 4;
- for mb_y in 0..mb_h {
- for mb_x in 0..mb_w {
- let mut blks: [[i32; 64]; 6] = [[0; 64]; 6];
- let mut has_ac: [bool; 6] = [false; 6];
-
- for i in 0..6 { has_ac[i] = br.read_bool()? }
-
- for i in 0..4 {
- decode_dct_block(br, &mut blks[i], ac_quant, has_ac[i], &self.dc_cb, &self.ac_cb)?;
- if (mb_x == 0) && (i == 0 || i == 2) {
- blks[i][0] += top_dc[0];
- top_dc[0] = blks[i][0];
- } else {
- blks[i][0] += left_dc[(i & 2) >> 1];
- }
- left_dc[(i & 2) >> 1] = blks[i][0];
- blks[i][0] <<= 5; // DC dequant
- if has_ac[i] {
- clv_dct(&mut blks[i]);
- } else {
- clv_dct_dc(&mut blks[i]);
- }
- }
- for i in 1..3 {
- let blk_idx = i + 3;
- decode_dct_block(br, &mut blks[blk_idx], ac_quant, has_ac[blk_idx], &self.dc_cb, &self.ac_cb)?;
- if mb_x == 0 {
- blks[blk_idx][0] += top_dc[i];
- top_dc[i] = blks[blk_idx][0];
- } else {
- blks[blk_idx][0] += left_dc[i + 1];
- }
- left_dc[i + 1] = blks[blk_idx][0];
- blks[blk_idx][0] <<= 5; // DC dequant
- if has_ac[blk_idx] {
- clv_dct(&mut blks[blk_idx]);
- } else {
- clv_dct_dc(&mut blks[blk_idx]);
- }
- }
- put_blocks(buf, mb_x, mb_y, &blks);
- }
- }
- Ok(())
- }
- fn decode_frame_inter(&mut self, br: &mut BitReader,
- buf: &mut NAVideoBuffer<u8>, prev: &mut NAVideoBuffer<u8>,
- width: usize, height: usize) -> DecoderResult<()> {
- let mb_size = 1 << self.tsize;
- let mb_w = (width + mb_size - 1) >> self.tsize;
- let mb_h = (height + mb_size - 1) >> self.tsize;
-
- let mut mvi = MVInfo::new();
- mvi.reset(mb_w, mb_h, mb_size);
-
- for t_y in 0..mb_h {
- for t_x in 0..mb_w {
- if !br.read_bool()? {
- let x = t_x << self.tsize;
- let y = t_y << self.tsize;
- let size = 1 << self.tsize;
- let tile = decode_tile_info(br, &self.ylev, 0)?;
- let mv = mvi.predict(t_x, t_y, tile.mv);
- restore_tree(buf, prev, 0, x, y, size, &tile, mv);
- let x = t_x << (self.tsize - 1);
- let y = t_y << (self.tsize - 1);
- let size = 1 << (self.tsize - 1);
- let mut cmv = mv + tile.mv;
- cmv.x /= 2;
- cmv.y /= 2;
- let tile = decode_tile_info(br, &self.ulev, 0)?;
- restore_tree(buf, prev, 1, x, y, size, &tile, cmv);
- let tile = decode_tile_info(br, &self.vlev, 0)?;
- restore_tree(buf, prev, 2, x, y, size, &tile, cmv);
- } else {
- let mv = mvi.predict(t_x, t_y, ZERO_MV);
- for plane in 0..3 {
- let x = if plane == 0 { t_x << self.tsize } else { t_x << (self.tsize - 1) };
- let y = if plane == 0 { t_y << self.tsize } else { t_y << (self.tsize - 1) };
- let size = if plane == 0 { 1 << self.tsize } else { 1 << (self.tsize - 1) };
- let mx = if plane == 0 { mv.x as isize } else { (mv.x >> 1) as isize };
- let my = if plane == 0 { mv.y as isize } else { (mv.y >> 1) as isize };
- copy_block(buf, prev, plane, x, y, mx, my, size);
- }
- }
- }
- mvi.update_row();
- }
- Ok(())
- }
-}
-
-impl NADecoder for ClearVideoDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if info.get_extradata().is_none() { return Err(DecoderError::InvalidData); }
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- let f = vinfo.is_flipped();
- let fmt = formats::YUV420_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
- self.frmmgr.clear();
- let edata = info.get_extradata().unwrap();
-//todo detect simply by extradata contents?
- if !self.is_rm {
- let mut mr = MemoryReader::new_read(edata.as_slice());
- let mut br = ByteReader::new(&mut mr);
- br.read_skip(0x5E).unwrap();
- let tile_size = br.read_u32le()?;
- self.tsize = tile_size.trailing_zeros() as u8;
- } else {
- let mut mr = MemoryReader::new_read(edata.as_slice());
- let mut br = ByteReader::new(&mut mr);
- br.read_skip(0x86).unwrap();
- let tile_size = br.read_u32be()?;
- self.tsize = tile_size.trailing_zeros() as u8;
- }
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
- if src.len() <= 1 { return Err(DecoderError::ShortData); }
- let off = if self.is_rm {
- let nhdr = src[0] as usize;
- (nhdr + 1) * 8 + 1
- } else {
- 0
- };
- if src.len() <= off + 1 { return Err(DecoderError::ShortData); }
-
- if (src[off] & 0x7F) == 0x30 {
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None);
- frm.set_keyframe(false);
- frm.set_frame_type(FrameType::Skip);
- return Ok(Rc::new(RefCell::new(frm)));
- }
-
- let is_intra = (src[off] & 2) == 2;
- let mut br = BitReader::new(&src[(off + 1)..], src.len() - (off + 1), BitReaderMode::BE);
-
- let vinfo = self.info.get_properties().get_video_info().unwrap();
- let bufret = alloc_video_buffer(vinfo, self.tsize);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let mut bufinfo = bufret.unwrap();
- let mut buf = bufinfo.get_vbuf().unwrap();
-
- if is_intra {
- let fsize = br.read(32)? as usize;
- validate!(fsize <= src.len() - off);
- self.decode_frame_intra(&mut br, &mut buf, vinfo.get_width(), vinfo.get_height())?;
- extend_edges(&mut buf, 1 << self.tsize);
- } else {
- let mut prev = self.frmmgr.clone_ref().unwrap();
- extend_edges(&mut prev, 1 << self.tsize);
- self.decode_frame_inter(&mut br, &mut buf, &mut prev, vinfo.get_width(), vinfo.get_height())?;
- extend_edges(&mut buf, 1 << self.tsize);
- }
- self.frmmgr.add_frame(buf);
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(is_intra);
- if is_intra {
- frm.set_frame_type(FrameType::I);
- } else {
- frm.set_frame_type(FrameType::P);
- }
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(ClearVideoDecoder::new(false))
-}
-
-pub fn get_decoder_rm() -> Box<NADecoder> {
- Box::new(ClearVideoDecoder::new(true))
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_clv() {
- test_file_decoding("avi", "assets/TalkingHead_352x288.avi", Some(10), true, false, None/*Some("clv")*/);
-// test_file_decoding("avi", "assets/basketball.avi", None/*Some(10)*/, true, false, Some("clv1"));
-//panic!("debug");
- }
-}
-
-const CLV_DC_CODES: &[u8] = &[
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x07, 0x0B,
- 0x0C, 0x08, 0x08, 0x09, 0x04, 0x06, 0x07, 0x05,
- 0x04, 0x05, 0x04, 0x06, 0x05, 0x06, 0x07, 0x05,
- 0x06, 0x07, 0x06, 0x07, 0x08, 0x06, 0x07, 0x08,
- 0x09, 0x0A, 0x0B, 0x07, 0x08, 0x09, 0x07, 0x08,
- 0x06, 0x07, 0x08, 0x06, 0x04, 0x05, 0x02, 0x01,
- 0x03, 0x06, 0x07, 0x07, 0x09, 0x0A, 0x0B, 0x09,
- 0x0A, 0x0B, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x09,
- 0x0D, 0x0A, 0x0B, 0x08, 0x09, 0x0A, 0x0B, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x06, 0x07, 0x06, 0x08,
- 0x07, 0x09, 0x0A, 0x0B, 0x09, 0x0A, 0x0B, 0x0C,
- 0x14, 0x0D, 0x0D, 0x0E, 0x0F, 0x15, 0x15, 0x16,
- 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E,
- 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
-];
-
-const CLV_DC_BITS: &[u8] = &[
- 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 21, 22, 22, 19, 20,
- 20, 19, 18, 18, 15, 17, 17, 16,
- 14, 15, 12, 13, 14, 14, 14, 12,
- 12, 12, 11, 11, 11, 10, 10, 10,
- 10, 10, 10, 9, 9, 9, 8, 8,
- 7, 7, 7, 6, 5, 5, 3, 1,
- 3, 5, 5, 6, 7, 7, 7, 8,
- 8, 8, 9, 9, 9, 9, 10, 11,
- 10, 11, 11, 12, 12, 12, 12, 13,
- 14, 14, 14, 14, 15, 15, 16, 17,
- 16, 17, 18, 18, 19, 19, 19, 19,
- 21, 19, 20, 19, 19, 21, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22,
-];
-
-const CLV_AC_SYMS: &[u16] = &[
- 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008,
- 0x0009, 0x000A, 0x000B, 0x000C, 0x0011, 0x0012, 0x0013, 0x0014,
- 0x0015, 0x0016, 0x0021, 0x0022, 0x0023, 0x0024, 0x0031, 0x0032,
- 0x0033, 0x0041, 0x0042, 0x0043, 0x0051, 0x0052, 0x0053, 0x0061,
- 0x0062, 0x0063, 0x0071, 0x0072, 0x0081, 0x0082, 0x0091, 0x0092,
- 0x00A1, 0x00A2, 0x00B1, 0x00C1, 0x00D1, 0x00E1, 0x00F1, 0x0101,
- 0x0111, 0x0121, 0x0131, 0x0141, 0x0151, 0x0161, 0x0171, 0x0181,
- 0x0191, 0x01A1, 0x1001, 0x1002, 0x1003, 0x1011, 0x1012, 0x1021,
- 0x1031, 0x1041, 0x1051, 0x1061, 0x1071, 0x1081, 0x1091, 0x10A1,
- 0x10B1, 0x10C1, 0x10D1, 0x10E1, 0x10F1, 0x1101, 0x1111, 0x1121,
- 0x1131, 0x1141, 0x1151, 0x1161, 0x1171, 0x1181, 0x1191, 0x11A1,
- 0x11B1, 0x11C1, 0x11D1, 0x11E1, 0x11F1, 0x1201, 0x1211, 0x1221,
- 0x1231, 0x1241, 0x1251, 0x1261, 0x1271, 0x1281, 0x1BFF,
-];
-
-const CLV_AC_CODES: &[u8] = &[
- 0x02, 0x0F, 0x15, 0x17, 0x1F, 0x25, 0x24, 0x21,
- 0x20, 0x07, 0x06, 0x20, 0x06, 0x14, 0x1E, 0x0F,
- 0x21, 0x50, 0x0E, 0x1D, 0x0E, 0x51, 0x0D, 0x23,
- 0x0D, 0x0C, 0x22, 0x52, 0x0B, 0x0C, 0x53, 0x13,
- 0x0B, 0x54, 0x12, 0x0A, 0x11, 0x09, 0x10, 0x08,
- 0x16, 0x55, 0x15, 0x14, 0x1C, 0x1B, 0x21, 0x20,
- 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x22, 0x23,
- 0x56, 0x57, 0x07, 0x19, 0x05, 0x0F, 0x04, 0x0E,
- 0x0D, 0x0C, 0x13, 0x12, 0x11, 0x10, 0x1A, 0x19,
- 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x18, 0x17,
- 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x07, 0x06,
- 0x05, 0x04, 0x24, 0x25, 0x26, 0x27, 0x58, 0x59,
- 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x03,
-];
-
-const CLV_AC_BITS: &[u8] = &[
- 2, 4, 6, 7, 8, 9, 9, 10,
- 10, 11, 11, 11, 3, 6, 8, 10,
- 11, 12, 4, 8, 10, 12, 5, 9,
- 10, 5, 9, 12, 5, 10, 12, 6,
- 10, 12, 6, 10, 6, 10, 6, 10,
- 7, 12, 7, 7, 8, 8, 9, 9,
- 9, 9, 9, 9, 9, 9, 11, 11,
- 12, 12, 4, 9, 11, 6, 11, 6,
- 6, 6, 7, 7, 7, 7, 8, 8,
- 8, 8, 8, 8, 8, 8, 9, 9,
- 9, 9, 9, 9, 9, 9, 10, 10,
- 10, 10, 11, 11, 11, 11, 12, 12,
- 12, 12, 12, 12, 12, 12, 7,
-];
-
-const CLV_AC_ESCAPE: u16 = 0x1BFF;
-
-const ZIGZAG: &[usize] = &[
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63
-];
-
-const CLV_BIAS_ESCAPE: u16 = 0x100;
-
-const CLV_MVY_0_BITS: &[u8] = &[
- 16, 14, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 14,
- 16, 15, 14, 14, 14, 13, 13, 12, 10, 7, 10, 12, 13, 13, 14, 14,
- 14, 15, 15, 14, 14, 14, 13, 13, 11, 10, 7, 10, 11, 13, 13, 14,
- 14, 14, 15, 15, 14, 14, 13, 13, 12, 11, 10, 7, 10, 11, 12, 13,
- 13, 14, 14, 15, 16, 15, 14, 12, 12, 12, 11, 10, 6, 10, 11, 12,
- 12, 12, 14, 15, 16, 15, 14, 13, 13, 12, 11, 10, 9, 6, 9, 10,
- 11, 12, 13, 13, 14, 15, 14, 14, 13, 12, 12, 11, 10, 8, 6, 8,
- 10, 11, 12, 12, 13, 14, 14, 14, 13, 13, 13, 11, 11, 9, 7, 4,
- 7, 9, 11, 11, 12, 13, 13, 14, 11, 10, 10, 9, 9, 8, 7, 5,
- 1, 5, 7, 8, 9, 9, 10, 10, 11, 14, 13, 13, 12, 11, 11, 9,
- 7, 4, 7, 9, 11, 11, 13, 13, 13, 14, 14, 14, 13, 12, 12, 11,
- 10, 8, 6, 8, 10, 11, 12, 12, 13, 14, 14, 15, 14, 13, 13, 12,
- 11, 10, 9, 7, 9, 10, 11, 12, 13, 13, 14, 15, 16, 15, 14, 12,
- 12, 12, 11, 10, 6, 10, 11, 12, 12, 12, 14, 15, 16, 15, 14, 14,
- 13, 13, 12, 11, 10, 7, 10, 11, 12, 13, 13, 14, 14, 15, 15, 14,
- 14, 14, 13, 13, 11, 10, 7, 10, 11, 13, 13, 14, 14, 14, 15, 15,
- 14, 14, 14, 13, 13, 12, 10, 7, 10, 12, 13, 13, 14, 14, 14, 15,
- 16, 14, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 14,
- 16, 6,
-];
-const CLV_MVY_0_CODES: &[u16] = &[
- 0xFFFD, 0x3FE5, 0x1FD8, 0x1FC4, 0x1FBC, 0x0FCB, 0x07CF, 0x07C4,
- 0x01D7, 0x07C6, 0x07CE, 0x0FCA, 0x1FBD, 0x1FC2, 0x1FD9, 0x3FE4,
- 0xFFFE, 0x7FF0, 0x3FEF, 0x3FD2, 0x3FC9, 0x1FCC, 0x1FC0, 0x0FB6,
- 0x03D6, 0x0070, 0x03D7, 0x0FB7, 0x1FC1, 0x1FCD, 0x3FCB, 0x3FD0,
- 0x3FED, 0x7FF2, 0x7FFB, 0x3FDC, 0x3FD9, 0x3FD4, 0x1FB6, 0x1FAE,
- 0x07C0, 0x03BC, 0x006D, 0x03BD, 0x07C1, 0x1FAF, 0x1FB7, 0x3FD1,
- 0x3FDB, 0x3FDF, 0x7FF9, 0x7FEE, 0x3FF0, 0x3FC7, 0x1FC9, 0x1FA7,
- 0x0FAD, 0x07D2, 0x03CE, 0x006C, 0x03CF, 0x07D0, 0x0FAF, 0x1FA6,
- 0x1FC6, 0x3FC4, 0x3FF1, 0x7FED, 0xFFFB, 0x7FF6, 0x3FE6, 0x0FCC,
- 0x0FC4, 0x0FB0, 0x07B0, 0x03C6, 0x0031, 0x03C7, 0x07B1, 0x0FB1,
- 0x0FC5, 0x0FCD, 0x3FEA, 0x7FF7, 0xFFF9, 0x7FE9, 0x3FCE, 0x1FCF,
- 0x1FB2, 0x0FB8, 0x07BC, 0x03D0, 0x01DA, 0x002F, 0x01DB, 0x03D1,
- 0x07BE, 0x0FBA, 0x1FB4, 0x1FD0, 0x3FCD, 0x7FEB, 0x3FE1, 0x3FC1,
- 0x1FD3, 0x0FC3, 0x0FBE, 0x07B6, 0x03C4, 0x00E4, 0x002D, 0x00E5,
- 0x03C5, 0x07B7, 0x0FBF, 0x0FC1, 0x1FD2, 0x3FC3, 0x3FE2, 0x3FBF,
- 0x1FDB, 0x1FAD, 0x1FA5, 0x07CB, 0x07BB, 0x01D5, 0x0068, 0x0008,
- 0x0065, 0x01D2, 0x07B8, 0x07C8, 0x0FD0, 0x1FAA, 0x1FDA, 0x3FBC,
- 0x07D4, 0x03CA, 0x03C0, 0x01D8, 0x01D0, 0x00E6, 0x0069, 0x0014,
- 0x0000, 0x0015, 0x006A, 0x00E7, 0x01D1, 0x01D9, 0x03C1, 0x03CB,
- 0x07D5, 0x3FBE, 0x1FDC, 0x1FAB, 0x0FD1, 0x07C9, 0x07B9, 0x01D3,
- 0x0066, 0x0009, 0x0067, 0x01D4, 0x07BA, 0x07CA, 0x1FA4, 0x1FAC,
- 0x1FDD, 0x3FBD, 0x3FE0, 0x3FC0, 0x1FD5, 0x0FC0, 0x0FBC, 0x07B4,
- 0x03C2, 0x00E2, 0x002C, 0x00E3, 0x03C3, 0x07B5, 0x0FBD, 0x0FC2,
- 0x1FD7, 0x3FC2, 0x3FE3, 0x7FEA, 0x3FCC, 0x1FCE, 0x1FB3, 0x0FB9,
- 0x07BD, 0x03D2, 0x01DC, 0x0064, 0x01DD, 0x03D3, 0x07BF, 0x0FBB,
- 0x1FB5, 0x1FD1, 0x3FCF, 0x7FE8, 0xFFFA, 0x7FF4, 0x3FEB, 0x0FCE,
- 0x0FC6, 0x0FB2, 0x07B2, 0x03C8, 0x0030, 0x03C9, 0x07B3, 0x0FB3,
- 0x0FC7, 0x0FCF, 0x3FE9, 0x7FF5, 0xFFF8, 0x7FF3, 0x3FF3, 0x3FC6,
- 0x1FC8, 0x1FA8, 0x0FAC, 0x07D1, 0x03CC, 0x006B, 0x03CD, 0x07D3,
- 0x0FAE, 0x1FA9, 0x1FC7, 0x3FC5, 0x3FF2, 0x7FEC, 0x7FFA, 0x3FDE,
- 0x3FDA, 0x3FD7, 0x1FB9, 0x1FB0, 0x07C2, 0x03BE, 0x006E, 0x03BF,
- 0x07C3, 0x1FB1, 0x1FB8, 0x3FD3, 0x3FD8, 0x3FDD, 0x7FF8, 0x7FEF,
- 0x3FEE, 0x3FD6, 0x3FC8, 0x1FCB, 0x1FBE, 0x0FB5, 0x03D4, 0x006F,
- 0x03D5, 0x0FB4, 0x1FBF, 0x1FCA, 0x3FCA, 0x3FD5, 0x3FEC, 0x7FF1,
- 0xFFFF, 0x3FE8, 0x1FD4, 0x1FC5, 0x1FBA, 0x0FC9, 0x07CD, 0x07C7,
- 0x01D6, 0x07C5, 0x07CC, 0x0FC8, 0x1FBB, 0x1FC3, 0x1FD6, 0x3FE7,
- 0xFFFC, 0x002E,
-];
-const CLV_MVY_0_SYMS: &[u16] = &[
- 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8,
- 0x00F8, 0x01F8, 0x02F8, 0x03F8, 0x04F8, 0x05F8, 0x06F8, 0x07F8,
- 0x08F8, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9,
- 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9,
- 0x07F9, 0x08F9, 0xF8FA, 0xF9FA, 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA,
- 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, 0x02FA, 0x03FA, 0x04FA, 0x05FA,
- 0x06FA, 0x07FA, 0x08FA, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB,
- 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB,
- 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC,
- 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC,
- 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0x08FC, 0xF8FD, 0xF9FD, 0xFAFD,
- 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD,
- 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0xF8FE, 0xF9FE,
- 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, 0xFEFE, 0xFFFE, 0x00FE, 0x01FE,
- 0x02FE, 0x03FE, 0x04FE, 0x05FE, 0x06FE, 0x07FE, 0x08FE, 0xF8FF,
- 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF,
- 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF,
- 0xF800, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00,
- 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
- 0x0800, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01,
- 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601,
- 0x0701, 0x0801, 0xF802, 0xF902, 0xFA02, 0xFB02, 0xFC02, 0xFD02,
- 0xFE02, 0xFF02, 0x0002, 0x0102, 0x0202, 0x0302, 0x0402, 0x0502,
- 0x0602, 0x0702, 0x0802, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03,
- 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403,
- 0x0503, 0x0603, 0x0703, 0x0803, 0xF804, 0xF904, 0xFA04, 0xFB04,
- 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304,
- 0x0404, 0x0504, 0x0604, 0x0704, 0x0804, 0xF805, 0xF905, 0xFA05,
- 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205,
- 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0xF806, 0xF906,
- 0xFA06, 0xFB06, 0xFC06, 0xFD06, 0xFE06, 0xFF06, 0x0006, 0x0106,
- 0x0206, 0x0306, 0x0406, 0x0506, 0x0606, 0x0706, 0x0806, 0xF807,
- 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007,
- 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807,
- 0xF808, 0xF908, 0xFA08, 0xFB08, 0xFC08, 0xFD08, 0xFE08, 0xFF08,
- 0x0008, 0x0108, 0x0208, 0x0308, 0x0408, 0x0508, 0x0608, 0x0708,
- 0x0808, 0x0909,
-];
-const CLV_MVY_0_ESCAPE: u16 = 0x0909;
-
-const CLV_FLAGSY_0_BITS: &[u8] = &[
- 3, 4, 4, 4, 4, 4, 6, 5, 4, 7, 4, 5, 4, 7, 5, 2,
-];
-const CLV_FLAGSY_0_CODES: &[u16] = &[
- 0x0002, 0x0009, 0x000B, 0x0006, 0x000C, 0x0007, 0x003E, 0x001C,
- 0x000D, 0x007E, 0x000A, 0x001D, 0x0008, 0x007F, 0x001E, 0x0000,
-];
-
-const CLV_MVY_1_BITS: &[u8] = &[
- 15, 15, 15, 15, 14, 14, 13, 13, 11, 9, 11, 13, 13, 14, 14, 15,
- 15, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 10, 9, 10, 12, 12,
- 12, 13, 13, 14, 14, 15, 15, 15, 14, 14, 13, 13, 13, 12, 11, 8,
- 11, 12, 13, 13, 13, 14, 14, 15, 15, 14, 14, 14, 14, 13, 12, 12,
- 12, 10, 8, 10, 12, 12, 12, 13, 14, 14, 14, 14, 15, 14, 14, 13,
- 13, 12, 12, 11, 10, 8, 10, 11, 12, 12, 13, 13, 14, 14, 15, 14,
- 14, 13, 13, 13, 12, 12, 11, 9, 7, 9, 11, 12, 12, 13, 13, 13,
- 14, 14, 14, 14, 13, 13, 13, 12, 11, 10, 9, 7, 9, 10, 11, 12,
- 13, 13, 13, 14, 14, 14, 13, 13, 12, 12, 11, 11, 10, 8, 7, 8,
- 10, 11, 11, 12, 12, 13, 13, 14, 13, 13, 13, 12, 11, 11, 10, 9,
- 6, 4, 6, 9, 10, 11, 12, 12, 13, 13, 13, 12, 11, 10, 10, 10,
- 9, 9, 7, 5, 1, 5, 7, 9, 9, 10, 10, 10, 11, 12, 13, 13,
- 13, 12, 11, 11, 10, 9, 6, 4, 6, 9, 10, 11, 11, 12, 13, 13,
- 13, 14, 13, 13, 12, 12, 11, 11, 10, 8, 7, 8, 10, 11, 11, 12,
- 12, 13, 13, 14, 14, 14, 13, 13, 13, 12, 11, 10, 9, 7, 9, 10,
- 11, 12, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 12, 12, 11, 9,
- 7, 9, 11, 12, 12, 13, 13, 13, 14, 14, 15, 14, 14, 13, 13, 12,
- 12, 11, 10, 8, 10, 11, 12, 12, 13, 13, 14, 14, 15, 14, 14, 14,
- 14, 13, 12, 12, 12, 10, 8, 10, 12, 12, 12, 13, 14, 14, 14, 14,
- 15, 15, 14, 14, 13, 13, 13, 12, 11, 8, 11, 12, 13, 13, 13, 14,
- 14, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 10, 9, 10, 12, 12,
- 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 14, 14, 13, 13, 11, 9,
- 11, 13, 13, 14, 14, 15, 15, 15, 15, 5,
-];
-const CLV_MVY_1_CODES: &[u16] = &[
- 0x7FF9, 0x7FF6, 0x7FEB, 0x7FE3, 0x3FCF, 0x3FB3, 0x1FBD, 0x1FA1,
- 0x07AD, 0x01CE, 0x07AF, 0x1FA0, 0x1FBB, 0x3FB0, 0x3FCC, 0x7FE2,
- 0x7FE9, 0x7FF4, 0x7FFB, 0x7FF1, 0x3FE7, 0x3FBD, 0x1FA5, 0x1F9B,
- 0x0FB4, 0x0FAF, 0x0FAA, 0x03CC, 0x01CD, 0x03CD, 0x0FAB, 0x0FAD,
- 0x0FB1, 0x1F9C, 0x1FA3, 0x3FBE, 0x3FE6, 0x7FF0, 0x7FFC, 0x7FE5,
- 0x3FB5, 0x3FAE, 0x1FB4, 0x1FAA, 0x1F97, 0x0F85, 0x07A2, 0x00DD,
- 0x07A3, 0x0F86, 0x1F99, 0x1FAD, 0x1FB2, 0x3FAC, 0x3FB7, 0x7FE4,
- 0x7FFD, 0x3FEA, 0x3FD8, 0x3FC3, 0x3FBB, 0x1FC9, 0x0FBC, 0x0F97,
- 0x0F8F, 0x03B8, 0x00DA, 0x03B9, 0x0F90, 0x0F98, 0x0FB9, 0x1FC6,
- 0x3FBA, 0x3FC0, 0x3FD9, 0x3FEB, 0x7FEF, 0x3FEE, 0x3FD7, 0x1FC3,
- 0x1F96, 0x0FC0, 0x0FA8, 0x07AA, 0x03BE, 0x00D9, 0x03BF, 0x07AB,
- 0x0FA7, 0x0FBF, 0x1F98, 0x1FC5, 0x3FD6, 0x3FEF, 0x7FEE, 0x3FDC,
- 0x3FCA, 0x1FBF, 0x1F8B, 0x1F87, 0x0FA2, 0x0F94, 0x07A5, 0x01D4,
- 0x0069, 0x01D5, 0x07A6, 0x0F95, 0x0FA3, 0x1F89, 0x1F8D, 0x1FC0,
- 0x3FC6, 0x3FDE, 0x3FE0, 0x3FD3, 0x1FB8, 0x1F8F, 0x1F84, 0x0F89,
- 0x07BC, 0x03C6, 0x01C6, 0x0067, 0x01C7, 0x03C7, 0x07BD, 0x0F87,
- 0x1F82, 0x1F8A, 0x1FB6, 0x3FD1, 0x3FE2, 0x3FC5, 0x1FCE, 0x1FAE,
- 0x0FB5, 0x0F8B, 0x07B4, 0x07B0, 0x03B4, 0x00DE, 0x0064, 0x00DF,
- 0x03B5, 0x07B1, 0x07B5, 0x0F8C, 0x0FB6, 0x1FAF, 0x1FD1, 0x3FCB,
- 0x1FD3, 0x1FCC, 0x1FA7, 0x0F9B, 0x07BE, 0x079C, 0x03C0, 0x01C8,
- 0x002E, 0x0008, 0x002F, 0x01C9, 0x03C1, 0x079D, 0x0F82, 0x0F9A,
- 0x1FA9, 0x1FCA, 0x1FD4, 0x0F9F, 0x07B6, 0x03C8, 0x03B2, 0x03B0,
- 0x01D6, 0x01D0, 0x006A, 0x0014, 0x0000, 0x0015, 0x006B, 0x01D1,
- 0x01D7, 0x03B1, 0x03B3, 0x03C9, 0x07B7, 0x0FA0, 0x1FD5, 0x1FCB,
- 0x1FAB, 0x0F9C, 0x07BF, 0x079E, 0x03C2, 0x01CA, 0x0030, 0x0009,
- 0x0031, 0x01CB, 0x03C3, 0x079F, 0x07C0, 0x0F9D, 0x1FAC, 0x1FCD,
- 0x1FD2, 0x3FC8, 0x1FD0, 0x1FB0, 0x0FB7, 0x0F8D, 0x07B8, 0x07B2,
- 0x03B6, 0x00E0, 0x0065, 0x00E1, 0x03B7, 0x07B3, 0x07B9, 0x0F8E,
- 0x0FB8, 0x1FB1, 0x1FCF, 0x3FC9, 0x3FE1, 0x3FD2, 0x1FB7, 0x1F8E,
- 0x1F83, 0x0F88, 0x07BA, 0x03C4, 0x01C4, 0x0066, 0x01C5, 0x03C5,
- 0x07BB, 0x0F8A, 0x1F85, 0x1F90, 0x1FB9, 0x3FD0, 0x3FE3, 0x3FDD,
- 0x3FC7, 0x1FC1, 0x1F91, 0x1F88, 0x0FA4, 0x0F96, 0x07A7, 0x01D2,
- 0x0068, 0x01D3, 0x07A4, 0x0F93, 0x0FA1, 0x1F86, 0x1F8C, 0x1FBE,
- 0x3FC4, 0x3FDF, 0x7FED, 0x3FEC, 0x3FD4, 0x1FC4, 0x1F92, 0x0FBD,
- 0x0FA5, 0x07A8, 0x03BC, 0x00D8, 0x03BD, 0x07A9, 0x0FA6, 0x0FBE,
- 0x1F93, 0x1FC2, 0x3FD5, 0x3FED, 0x7FEC, 0x3FE8, 0x3FDB, 0x3FC1,
- 0x3FB9, 0x1FC7, 0x0FBA, 0x0F9E, 0x0F91, 0x03BA, 0x00DB, 0x03BB,
- 0x0F92, 0x0F99, 0x0FBB, 0x1FC8, 0x3FB8, 0x3FC2, 0x3FDA, 0x3FE9,
- 0x7FFF, 0x7FE7, 0x3FB6, 0x3FAF, 0x1FB3, 0x1FA6, 0x1F94, 0x0F83,
- 0x07A0, 0x00DC, 0x07A1, 0x0F84, 0x1F95, 0x1FA8, 0x1FB5, 0x3FAD,
- 0x3FB4, 0x7FE6, 0x7FFE, 0x7FF3, 0x3FE5, 0x3FBC, 0x1FA4, 0x1F9D,
- 0x0FB2, 0x0FAE, 0x0FA9, 0x03CA, 0x01CC, 0x03CB, 0x0FAC, 0x0FB0,
- 0x0FB3, 0x1F9A, 0x1FA2, 0x3FBF, 0x3FE4, 0x7FF2, 0x7FF8, 0x7FF5,
- 0x7FEA, 0x7FE0, 0x3FCD, 0x3FB1, 0x1FBA, 0x1F9F, 0x07AE, 0x01CF,
- 0x07AC, 0x1F9E, 0x1FBC, 0x3FB2, 0x3FCE, 0x7FE1, 0x7FE8, 0x7FF7,
- 0x7FFA, 0x0016,
-];
-const CLV_MVY_1_SYMS: &[u16] = &[
- 0xF7F7, 0xF8F7, 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7,
- 0xFFF7, 0x00F7, 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7,
- 0x07F7, 0x08F7, 0x09F7, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8,
- 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8,
- 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0xF7F9, 0xF8F9,
- 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9,
- 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0x08F9,
- 0x09F9, 0xF7FA, 0xF8FA, 0xF9FA, 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA,
- 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, 0x02FA, 0x03FA, 0x04FA, 0x05FA,
- 0x06FA, 0x07FA, 0x08FA, 0x09FA, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB,
- 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB,
- 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0xF7FC,
- 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC,
- 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC,
- 0x08FC, 0x09FC, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD,
- 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD,
- 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0xF7FE, 0xF8FE, 0xF9FE,
- 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, 0xFEFE, 0xFFFE, 0x00FE, 0x01FE,
- 0x02FE, 0x03FE, 0x04FE, 0x05FE, 0x06FE, 0x07FE, 0x08FE, 0x09FE,
- 0xF7FF, 0xF8FF, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF,
- 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF,
- 0x07FF, 0x08FF, 0x09FF, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00,
- 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300,
- 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0xF701, 0xF801,
- 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001,
- 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0x0801,
- 0x0901, 0xF702, 0xF802, 0xF902, 0xFA02, 0xFB02, 0xFC02, 0xFD02,
- 0xFE02, 0xFF02, 0x0002, 0x0102, 0x0202, 0x0302, 0x0402, 0x0502,
- 0x0602, 0x0702, 0x0802, 0x0902, 0xF703, 0xF803, 0xF903, 0xFA03,
- 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203,
- 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0xF704,
- 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04,
- 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704,
- 0x0804, 0x0904, 0xF705, 0xF805, 0xF905, 0xFA05, 0xFB05, 0xFC05,
- 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405,
- 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0xF706, 0xF806, 0xF906,
- 0xFA06, 0xFB06, 0xFC06, 0xFD06, 0xFE06, 0xFF06, 0x0006, 0x0106,
- 0x0206, 0x0306, 0x0406, 0x0506, 0x0606, 0x0706, 0x0806, 0x0906,
- 0xF707, 0xF807, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07,
- 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607,
- 0x0707, 0x0807, 0x0907, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08,
- 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308,
- 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0xF709, 0xF809,
- 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09, 0xFF09, 0x0009,
- 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609, 0x0709, 0x0809,
- 0x0909, 0x0A0A,
-];
-const CLV_MVY_1_ESCAPE: u16 = 0x0A0A;
-
-const CLV_BIASY_1_BITS: &[u8] = &[
- 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13,
- 13, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9,
- 8, 8, 7, 7, 5, 2, 1, 3, 5, 7, 7, 8, 9, 9, 10, 10,
- 10, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13,
- 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 12,
-];
-const CLV_BIASY_1_CODES: &[u16] = &[
- 0xFFFE, 0x7FFE, 0x7FFC, 0x7FFA, 0x7FF6, 0x7FF7, 0x7FF3, 0x7FF2,
- 0x7FEF, 0x7FEE, 0x3FF5, 0x3FF3, 0x3FF1, 0x1FF7, 0x1FF5, 0x1FF2,
- 0x1FF0, 0x1FEE, 0x1FEC, 0x1FEA, 0x1FE8, 0x0FF2, 0x0FF0, 0x0FEE,
- 0x0FEB, 0x07F4, 0x07F3, 0x07F1, 0x03F7, 0x03F5, 0x03F3, 0x01F7,
- 0x00FA, 0x00F8, 0x007A, 0x0078, 0x001C, 0x0002, 0x0000, 0x0006,
- 0x001D, 0x0079, 0x007B, 0x00F9, 0x01F6, 0x01F8, 0x03F2, 0x03F4,
- 0x03F6, 0x07F0, 0x07F2, 0x0FEA, 0x0FEC, 0x0FEF, 0x0FF1, 0x0FF3,
- 0x1FE9, 0x1FEB, 0x1FED, 0x1FEF, 0x1FF1, 0x1FF3, 0x1FF4, 0x1FF6,
- 0x3FF0, 0x3FF2, 0x3FF4, 0x3FF6, 0x7FF0, 0x7FF1, 0x7FF4, 0x7FF8,
- 0x7FF5, 0x7FF9, 0x7FFB, 0x7FFD, 0xFFFF, 0x0FED,
-];
-const CLV_BIASY_1_SYMS: &[u16] = &[
- 0xFF68, 0xFF6C, 0xFF70, 0xFF74, 0xFF78, 0xFF7C, 0xFF80, 0xFF84,
- 0xFF88, 0xFF8C, 0xFF90, 0xFF94, 0xFF98, 0xFF9C, 0xFFA0, 0xFFA4,
- 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4,
- 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4,
- 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004,
- 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024,
- 0x0028, 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044,
- 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, 0x0060, 0x0064,
- 0x0068, 0x006C, 0x0070, 0x0074, 0x0078, 0x007C, 0x0080, 0x0084,
- 0x0088, 0x008C, 0x0090, 0x0094, 0x0098, 0x0100,
-];
-
-const CLV_FLAGSY_1_BITS: &[u8] = &[
- 2, 4, 4, 3, 4, 4, 7, 6, 4, 6, 4, 6, 4, 8, 8, 3,
-];
-const CLV_FLAGSY_1_CODES: &[u16] = &[
- 0x0000, 0x000A, 0x000C, 0x0003, 0x000B, 0x0009, 0x007E, 0x003D,
- 0x000D, 0x003E, 0x000E, 0x003C, 0x0008, 0x00FE, 0x00FF, 0x0002,
-];
-
-const CLV_MVY_2_BITS: &[u8] = &[
- 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11,
- 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16,
- 15, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 11, 10, 11,
- 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 15,
- 15, 15, 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 11, 10, 11, 13,
- 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 15, 15,
- 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 12, 11, 9, 11, 12, 13,
- 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 16, 16, 15, 15, 14,
- 14, 13, 13, 13, 13, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13,
- 13, 13, 13, 13, 13, 13, 14, 14, 14, 15, 16, 16, 15, 15, 15, 14,
- 13, 13, 13, 13, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13,
- 13, 13, 13, 13, 13, 14, 15, 15, 15, 16, 16, 15, 15, 15, 15, 14,
- 14, 13, 13, 13, 12, 12, 12, 11, 11, 9, 11, 11, 12, 12, 12, 13,
- 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 15, 15, 14, 14, 14, 13,
- 13, 13, 12, 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13,
- 13, 13, 14, 14, 14, 15, 15, 16, 16, 15, 14, 14, 14, 13, 13, 13,
- 13, 12, 12, 12, 11, 11, 10, 8, 10, 11, 11, 12, 12, 12, 13, 13,
- 13, 13, 14, 14, 14, 15, 16, 15, 15, 14, 14, 13, 13, 13, 13, 13,
- 12, 12, 12, 11, 10, 9, 8, 9, 10, 11, 12, 12, 12, 13, 13, 13,
- 13, 13, 14, 14, 15, 15, 15, 15, 14, 14, 13, 13, 13, 13, 13, 12,
- 12, 11, 11, 10, 10, 7, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13,
- 13, 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12,
- 11, 11, 10, 9, 7, 9, 10, 11, 11, 12, 12, 12, 12, 12, 13, 13,
- 14, 14, 14, 14, 15, 13, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11,
- 11, 10, 8, 7, 8, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13,
- 13, 13, 15, 14, 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10,
- 9, 8, 6, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14,
- 14, 14, 16, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 9, 9, 8,
- 6, 4, 6, 8, 9, 9, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13,
- 16, 12, 12, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 8, 7, 4,
- 2, 4, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
- 16, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 9, 9, 8, 6, 4,
- 6, 8, 9, 9, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 16, 14,
- 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 9, 8, 6, 8,
- 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 13,
- 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 10, 8, 7, 8, 10,
- 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 15, 14, 14, 14,
- 14, 13, 13, 12, 12, 12, 12, 12, 11, 11, 10, 9, 7, 9, 10, 11,
- 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 14, 14,
- 13, 13, 13, 13, 13, 12, 12, 11, 11, 10, 10, 7, 10, 10, 11, 11,
- 12, 12, 13, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 14, 14, 13,
- 13, 13, 13, 13, 12, 12, 12, 11, 10, 9, 8, 9, 10, 11, 12, 12,
- 12, 13, 13, 13, 13, 13, 14, 14, 15, 15, 16, 15, 14, 14, 14, 13,
- 13, 13, 13, 12, 12, 12, 11, 11, 10, 8, 10, 11, 11, 12, 12, 12,
- 13, 13, 13, 13, 14, 14, 14, 15, 16, 16, 15, 15, 14, 14, 14, 13,
- 13, 13, 12, 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13,
- 13, 13, 14, 14, 14, 15, 15, 16, 16, 15, 15, 15, 15, 14, 14, 13,
- 13, 13, 12, 12, 12, 11, 11, 9, 11, 11, 12, 12, 12, 13, 13, 13,
- 14, 14, 15, 15, 15, 15, 16, 16, 15, 15, 15, 14, 13, 13, 13, 13,
- 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 13, 13, 13,
- 13, 14, 15, 15, 15, 16, 16, 15, 15, 14, 14, 13, 13, 13, 13, 13,
- 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13,
- 14, 14, 14, 15, 16, 16, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13,
- 13, 13, 12, 11, 9, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14,
- 15, 15, 15, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13,
- 13, 13, 11, 10, 11, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15,
- 15, 15, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13,
- 13, 12, 10, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
- 15, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13,
- 12, 11, 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16,
- 16, 7,
-];
-const CLV_MVY_2_CODES: &[u16] = &[
- 0xFFF5, 0xFFD8, 0x7FE6, 0x7FB9, 0x7FB5, 0x7FB0, 0x7FA0, 0x7F99,
- 0x7F93, 0x3FAA, 0x3F9B, 0x3F52, 0x1F76, 0x1EF5, 0x0F0B, 0x06F0,
- 0x0F08, 0x1EF0, 0x1F75, 0x3F53, 0x3F9A, 0x3FA8, 0x7F94, 0x7F98,
- 0x7F9E, 0x7FAE, 0x7FAF, 0x7FB7, 0x7FE9, 0xFFDB, 0xFFF6, 0xFFFD,
- 0x7FD9, 0x7FCC, 0x7FC6, 0x7F9C, 0x7F80, 0x3FA5, 0x3F80, 0x3F6A,
- 0x3F31, 0x1F54, 0x1F40, 0x1F11, 0x1F05, 0x075E, 0x0360, 0x075F,
- 0x1F07, 0x1F12, 0x1F43, 0x1F56, 0x3F33, 0x3F68, 0x3F83, 0x3FA6,
- 0x7F7F, 0x7F9A, 0x7FC9, 0x7FCA, 0x7FDB, 0xFFF8, 0xFFEC, 0x7FDE,
- 0x7FE2, 0x7FA6, 0x7F6F, 0x3FA1, 0x3F8D, 0x3F5C, 0x3F39, 0x3F21,
- 0x3F18, 0x1F58, 0x1F1E, 0x1EF1, 0x0740, 0x035A, 0x0741, 0x1EF2,
- 0x1F1F, 0x1F5A, 0x3F19, 0x3F22, 0x3F3B, 0x3F5E, 0x3F8E, 0x3FA3,
- 0x7F6B, 0x7FA2, 0x7FE3, 0x7FE1, 0xFFEE, 0xFFFC, 0x7FC3, 0x7FBC,
- 0x7F71, 0x3F96, 0x3F86, 0x3F7A, 0x3F72, 0x3F59, 0x3F46, 0x1F0A,
- 0x1EFD, 0x1ED0, 0x0F02, 0x0712, 0x019F, 0x0713, 0x0F03, 0x1ED3,
- 0x1EFF, 0x1F09, 0x3F4A, 0x3F5A, 0x3F76, 0x3F7B, 0x3F87, 0x3F97,
- 0x7F73, 0x7FBB, 0x7FBF, 0xFFFB, 0xFFEB, 0x7F88, 0x7F5C, 0x3F7C,
- 0x3F3C, 0x1F60, 0x1F4C, 0x1F14, 0x1F0C, 0x1F00, 0x1EF9, 0x1ED8,
- 0x0F42, 0x075A, 0x0714, 0x0186, 0x0715, 0x075B, 0x0F43, 0x1EDA,
- 0x1EFA, 0x1F01, 0x1F0E, 0x1F15, 0x1F4D, 0x1F62, 0x3F3D, 0x3F7D,
- 0x3FAC, 0x7F86, 0xFFE8, 0xFFE7, 0x7FA7, 0x7F8C, 0x7F68, 0x3F9C,
- 0x1F7C, 0x1F6C, 0x1F69, 0x1EEC, 0x1EE4, 0x1ED5, 0x1ECD, 0x0EF0,
- 0x0752, 0x06F6, 0x018C, 0x06F7, 0x0753, 0x0EF1, 0x1ECE, 0x1ED6,
- 0x1EE5, 0x1EED, 0x1F6A, 0x1F6E, 0x1F7D, 0x3F9F, 0x7F66, 0x7F8A,
- 0x7FA5, 0xFFE6, 0xFFDC, 0x7FDA, 0x7FC0, 0x7FAC, 0x7F61, 0x3F42,
- 0x3F0E, 0x1F45, 0x1F2C, 0x1ECA, 0x0F27, 0x0EF6, 0x0EEE, 0x072E,
- 0x06F4, 0x0185, 0x06F5, 0x072F, 0x0EEF, 0x0EF7, 0x0F28, 0x1ECB,
- 0x1F2F, 0x1F46, 0x3F0F, 0x3F40, 0x7F5F, 0x7FB4, 0x7FC2, 0x7FDC,
- 0xFFDA, 0xFFE0, 0x7F72, 0x7F63, 0x3F70, 0x3F1C, 0x3F16, 0x1F82,
- 0x1EE2, 0x1EB2, 0x0F4C, 0x0EFC, 0x0EE0, 0x0ED3, 0x0722, 0x036C,
- 0x00BF, 0x036D, 0x0723, 0x0ECC, 0x0EE1, 0x0EFF, 0x0F4D, 0x1EB3,
- 0x1EE3, 0x1F83, 0x3F17, 0x3F1F, 0x3F75, 0x7F65, 0x7F70, 0xFFE2,
- 0xFFD7, 0x7F76, 0x3F2B, 0x3F13, 0x3F0A, 0x1F33, 0x1F23, 0x1EB4,
- 0x1EA0, 0x0F46, 0x0F32, 0x0F1A, 0x0756, 0x0728, 0x0356, 0x00B0,
- 0x0357, 0x0729, 0x0757, 0x0F1B, 0x0F33, 0x0F47, 0x1EA1, 0x1EB5,
- 0x1F20, 0x1F30, 0x3F08, 0x3F10, 0x3F28, 0x7F77, 0xFFD5, 0x7FD5,
- 0x7FD1, 0x3F5D, 0x3F25, 0x1F34, 0x1F24, 0x1EE8, 0x1EBC, 0x1EA8,
- 0x0F3A, 0x0F2E, 0x0EE2, 0x071C, 0x0374, 0x01A0, 0x00AE, 0x01A1,
- 0x0375, 0x071D, 0x0EE3, 0x0F2F, 0x0F3C, 0x1EA9, 0x1EBD, 0x1EE9,
- 0x1F25, 0x1F36, 0x3F24, 0x3F61, 0x7FCE, 0x7FD2, 0x7F91, 0x7F7D,
- 0x3F6C, 0x3F34, 0x1F72, 0x1F61, 0x1EDD, 0x1EC5, 0x1EA5, 0x0F05,
- 0x0ED6, 0x0750, 0x073E, 0x0368, 0x034A, 0x0052, 0x034B, 0x0369,
- 0x073F, 0x0751, 0x0ED7, 0x0F07, 0x1EA7, 0x1EC7, 0x1EDF, 0x1F65,
- 0x1F70, 0x3F36, 0x3F6F, 0x7F7C, 0x7F8F, 0x3F90, 0x3F66, 0x3F58,
- 0x3F4E, 0x1F48, 0x1EBB, 0x0F40, 0x0F18, 0x0F10, 0x0EDA, 0x0ECF,
- 0x0732, 0x0704, 0x0354, 0x0190, 0x004F, 0x0191, 0x0355, 0x0705,
- 0x0733, 0x0ED0, 0x0EDB, 0x0F11, 0x0F19, 0x0F41, 0x1EB8, 0x1F4B,
- 0x3F4F, 0x3F55, 0x3F65, 0x3F92, 0x7F85, 0x1F51, 0x1F39, 0x1F2B,
- 0x1F18, 0x1EC2, 0x0F38, 0x0F14, 0x0ECA, 0x074C, 0x0736, 0x0700,
- 0x06FC, 0x0350, 0x00BA, 0x004D, 0x00BB, 0x0351, 0x06FD, 0x0701,
- 0x0737, 0x074D, 0x0ECB, 0x0F15, 0x0F39, 0x1EC3, 0x1F1B, 0x1F2E,
- 0x1F3A, 0x1F53, 0x7F82, 0x3F8A, 0x3F47, 0x3F2E, 0x1F5E, 0x1E9E,
- 0x0F24, 0x0F20, 0x0EC6, 0x0746, 0x0726, 0x070E, 0x0370, 0x035E,
- 0x018A, 0x00AC, 0x0021, 0x00AD, 0x018B, 0x035F, 0x0371, 0x070F,
- 0x0727, 0x0747, 0x0EC7, 0x0F21, 0x0F25, 0x1E9F, 0x1F5F, 0x3F2D,
- 0x3F48, 0x3F8B, 0xFFF1, 0x1F78, 0x1F3D, 0x1EAD, 0x0F2B, 0x0EF9,
- 0x0EE9, 0x0739, 0x0719, 0x0709, 0x0363, 0x019B, 0x0195, 0x00B3,
- 0x0023, 0x0005, 0x0024, 0x00B4, 0x0196, 0x019C, 0x0364, 0x070A,
- 0x071A, 0x073A, 0x0EEA, 0x0EFA, 0x0F2C, 0x1EAE, 0x1F3E, 0x1F79,
- 0xFFF0, 0x0F0C, 0x0EE6, 0x0EDC, 0x0EC2, 0x0748, 0x0706, 0x0372,
- 0x034C, 0x0198, 0x0192, 0x00C0, 0x00BC, 0x00B6, 0x0053, 0x0006,
- 0x0000, 0x0007, 0x0054, 0x00B7, 0x00BD, 0x00C1, 0x0193, 0x0199,
- 0x034D, 0x0373, 0x0707, 0x0749, 0x0EC3, 0x0EDD, 0x0EE7, 0x0F0D,
- 0xFFF2, 0x1F7A, 0x1F3F, 0x1EAF, 0x0F2D, 0x0EFB, 0x0EEB, 0x073B,
- 0x071B, 0x070B, 0x0365, 0x019D, 0x0197, 0x00B5, 0x0025, 0x0004,
- 0x0022, 0x00B2, 0x0194, 0x019A, 0x0362, 0x0708, 0x0718, 0x0738,
- 0x0EE8, 0x0EF8, 0x0F2A, 0x1EAC, 0x1F3C, 0x1F7B, 0xFFF3, 0x3F89,
- 0x3F44, 0x3F2F, 0x1F5C, 0x1E9C, 0x0F22, 0x0F1E, 0x0EC4, 0x0744,
- 0x0724, 0x070C, 0x036E, 0x035C, 0x0188, 0x00AA, 0x0020, 0x00AB,
- 0x0189, 0x035D, 0x036F, 0x070D, 0x0725, 0x0745, 0x0EC5, 0x0F1F,
- 0x0F23, 0x1E9D, 0x1F5D, 0x3F2C, 0x3F45, 0x3F88, 0x7F81, 0x1F52,
- 0x1F38, 0x1F28, 0x1F19, 0x1EC0, 0x0F36, 0x0F12, 0x0EC8, 0x074A,
- 0x0734, 0x06FE, 0x06FA, 0x034E, 0x00B8, 0x004C, 0x00B9, 0x034F,
- 0x06FB, 0x06FF, 0x0735, 0x074B, 0x0EC9, 0x0F13, 0x0F37, 0x1EC1,
- 0x1F1A, 0x1F29, 0x1F3B, 0x1F50, 0x7F84, 0x3F91, 0x3F64, 0x3F54,
- 0x3F4C, 0x1F49, 0x1EB9, 0x0F3B, 0x0F16, 0x0F0E, 0x0ED8, 0x0ECD,
- 0x0730, 0x0702, 0x0352, 0x018E, 0x004E, 0x018F, 0x0353, 0x0703,
- 0x0731, 0x0ECE, 0x0ED9, 0x0F0F, 0x0F17, 0x0F3D, 0x1EBA, 0x1F4A,
- 0x3F4D, 0x3F51, 0x3F67, 0x3F93, 0x7F90, 0x7F7A, 0x3F6E, 0x3F37,
- 0x1F71, 0x1F63, 0x1EDC, 0x1EC4, 0x1EA4, 0x0F04, 0x0ED4, 0x074E,
- 0x073C, 0x0366, 0x0348, 0x0051, 0x0349, 0x0367, 0x073D, 0x074F,
- 0x0ED5, 0x0F06, 0x1EA6, 0x1EC6, 0x1EDE, 0x1F64, 0x1F73, 0x3F35,
- 0x3F6D, 0x7F7B, 0x7F8E, 0x7FD4, 0x7FD0, 0x3F5F, 0x3F26, 0x1F35,
- 0x1F27, 0x1EEA, 0x1EBE, 0x1EAA, 0x0F3E, 0x0F30, 0x0EE4, 0x071E,
- 0x0376, 0x01A2, 0x00AF, 0x01A3, 0x0377, 0x071F, 0x0EE5, 0x0F31,
- 0x0F3F, 0x1EAB, 0x1EBF, 0x1EEB, 0x1F26, 0x1F37, 0x3F27, 0x3F62,
- 0x7FCF, 0x7FD3, 0xFFD4, 0x7F78, 0x3F29, 0x3F11, 0x3F0B, 0x1F32,
- 0x1F22, 0x1EB6, 0x1EA2, 0x0F48, 0x0F34, 0x0F1C, 0x0758, 0x072A,
- 0x0358, 0x00B1, 0x0359, 0x072B, 0x0759, 0x0F1D, 0x0F35, 0x0F49,
- 0x1EA3, 0x1EB7, 0x1F21, 0x1F31, 0x3F09, 0x3F12, 0x3F2A, 0x7F79,
- 0xFFD6, 0xFFE1, 0x7F6D, 0x7F64, 0x3F73, 0x3F1D, 0x3F14, 0x1F81,
- 0x1EE0, 0x1EB0, 0x0F4A, 0x0EFD, 0x0EDE, 0x0ED1, 0x0720, 0x036A,
- 0x00BE, 0x036B, 0x0721, 0x0ED2, 0x0EDF, 0x0EFE, 0x0F4B, 0x1EB1,
- 0x1EE1, 0x1F7E, 0x3F15, 0x3F1E, 0x3F74, 0x7F62, 0x7F75, 0xFFE3,
- 0xFFDE, 0x7FDD, 0x7FBE, 0x7FB3, 0x7F60, 0x3F43, 0x3F0C, 0x1F47,
- 0x1F2D, 0x1EC8, 0x0F26, 0x0EF4, 0x0EEC, 0x072C, 0x06F2, 0x0184,
- 0x06F3, 0x072D, 0x0EED, 0x0EF5, 0x0F29, 0x1EC9, 0x1F2A, 0x1F44,
- 0x3F0D, 0x3F41, 0x7F5E, 0x7FB1, 0x7FC1, 0x7FD7, 0xFFDF, 0xFFEA,
- 0x7FA3, 0x7F8B, 0x7F69, 0x3F9E, 0x1F7F, 0x1F6D, 0x1F6B, 0x1EEE,
- 0x1EE6, 0x1ED4, 0x1ECF, 0x0EF2, 0x0754, 0x06F8, 0x018D, 0x06F9,
- 0x0755, 0x0EF3, 0x1ECC, 0x1ED7, 0x1EE7, 0x1EEF, 0x1F68, 0x1F6F,
- 0x1F80, 0x3F9D, 0x7F67, 0x7F8D, 0x7FA8, 0xFFE9, 0xFFE5, 0x7F89,
- 0x7F5D, 0x3F7F, 0x3F3F, 0x1F67, 0x1F4F, 0x1F17, 0x1F0F, 0x1F02,
- 0x1EFB, 0x1ED9, 0x0F45, 0x075C, 0x0716, 0x0187, 0x0717, 0x075D,
- 0x0F44, 0x1EDB, 0x1EF8, 0x1F03, 0x1F0D, 0x1F16, 0x1F4E, 0x1F66,
- 0x3F3E, 0x3F7E, 0x3FAD, 0x7F87, 0xFFE4, 0xFFF9, 0x7FC4, 0x7FBA,
- 0x7F6E, 0x3F95, 0x3F85, 0x3F78, 0x3F77, 0x3F5B, 0x3F49, 0x1F08,
- 0x1EFE, 0x1ED2, 0x0F01, 0x0710, 0x019E, 0x0711, 0x0F00, 0x1ED1,
- 0x1EFC, 0x1F0B, 0x3F4B, 0x3F57, 0x3F71, 0x3F79, 0x3F84, 0x3F94,
- 0x7F74, 0x7FBD, 0x7FC5, 0xFFFE, 0xFFED, 0x7FE0, 0x7FDF, 0x7FA4,
- 0x7F6A, 0x3FA0, 0x3F8F, 0x3F63, 0x3F3A, 0x3F23, 0x3F1A, 0x1F59,
- 0x1F1D, 0x1EF3, 0x0743, 0x035B, 0x0742, 0x1EF7, 0x1F1C, 0x1F5B,
- 0x3F1B, 0x3F20, 0x3F38, 0x3F60, 0x3F8C, 0x3FA2, 0x7F6C, 0x7FA9,
- 0x7FE5, 0x7FE4, 0xFFEF, 0xFFFF, 0x7FD6, 0x7FCB, 0x7FC7, 0x7F9B,
- 0x7F83, 0x3FA4, 0x3F81, 0x3F69, 0x3F30, 0x1F57, 0x1F41, 0x1F13,
- 0x1F06, 0x0EC0, 0x0361, 0x0EC1, 0x1F04, 0x1F10, 0x1F42, 0x1F55,
- 0x3F32, 0x3F6B, 0x3F82, 0x3FA7, 0x7F7E, 0x7F9D, 0x7FC8, 0x7FCD,
- 0x7FD8, 0xFFFA, 0xFFF7, 0xFFD9, 0x7FE8, 0x7FB6, 0x7FAB, 0x7FAA,
- 0x7FA1, 0x7F96, 0x7F95, 0x3FAB, 0x3F98, 0x3F50, 0x1F77, 0x1EF4,
- 0x0F0A, 0x06F1, 0x0F09, 0x1EF6, 0x1F74, 0x3F56, 0x3F99, 0x3FA9,
- 0x7F92, 0x7F97, 0x7F9F, 0x7FAD, 0x7FB2, 0x7FB8, 0x7FE7, 0xFFDD,
- 0xFFF4, 0x0050,
-];
-const CLV_MVY_2_SYMS: &[u16] = &[
- 0xF1F1, 0xF2F1, 0xF3F1, 0xF4F1, 0xF5F1, 0xF6F1, 0xF7F1, 0xF8F1,
- 0xF9F1, 0xFAF1, 0xFBF1, 0xFCF1, 0xFDF1, 0xFEF1, 0xFFF1, 0x00F1,
- 0x01F1, 0x02F1, 0x03F1, 0x04F1, 0x05F1, 0x06F1, 0x07F1, 0x08F1,
- 0x09F1, 0x0AF1, 0x0BF1, 0x0CF1, 0x0DF1, 0x0EF1, 0x0FF1, 0xF1F2,
- 0xF2F2, 0xF3F2, 0xF4F2, 0xF5F2, 0xF6F2, 0xF7F2, 0xF8F2, 0xF9F2,
- 0xFAF2, 0xFBF2, 0xFCF2, 0xFDF2, 0xFEF2, 0xFFF2, 0x00F2, 0x01F2,
- 0x02F2, 0x03F2, 0x04F2, 0x05F2, 0x06F2, 0x07F2, 0x08F2, 0x09F2,
- 0x0AF2, 0x0BF2, 0x0CF2, 0x0DF2, 0x0EF2, 0x0FF2, 0xF1F3, 0xF2F3,
- 0xF3F3, 0xF4F3, 0xF5F3, 0xF6F3, 0xF7F3, 0xF8F3, 0xF9F3, 0xFAF3,
- 0xFBF3, 0xFCF3, 0xFDF3, 0xFEF3, 0xFFF3, 0x00F3, 0x01F3, 0x02F3,
- 0x03F3, 0x04F3, 0x05F3, 0x06F3, 0x07F3, 0x08F3, 0x09F3, 0x0AF3,
- 0x0BF3, 0x0CF3, 0x0DF3, 0x0EF3, 0x0FF3, 0xF1F4, 0xF2F4, 0xF3F4,
- 0xF4F4, 0xF5F4, 0xF6F4, 0xF7F4, 0xF8F4, 0xF9F4, 0xFAF4, 0xFBF4,
- 0xFCF4, 0xFDF4, 0xFEF4, 0xFFF4, 0x00F4, 0x01F4, 0x02F4, 0x03F4,
- 0x04F4, 0x05F4, 0x06F4, 0x07F4, 0x08F4, 0x09F4, 0x0AF4, 0x0BF4,
- 0x0CF4, 0x0DF4, 0x0EF4, 0x0FF4, 0xF1F5, 0xF2F5, 0xF3F5, 0xF4F5,
- 0xF5F5, 0xF6F5, 0xF7F5, 0xF8F5, 0xF9F5, 0xFAF5, 0xFBF5, 0xFCF5,
- 0xFDF5, 0xFEF5, 0xFFF5, 0x00F5, 0x01F5, 0x02F5, 0x03F5, 0x04F5,
- 0x05F5, 0x06F5, 0x07F5, 0x08F5, 0x09F5, 0x0AF5, 0x0BF5, 0x0CF5,
- 0x0DF5, 0x0EF5, 0x0FF5, 0xF1F6, 0xF2F6, 0xF3F6, 0xF4F6, 0xF5F6,
- 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6,
- 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6,
- 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0x0BF6, 0x0CF6, 0x0DF6,
- 0x0EF6, 0x0FF6, 0xF1F7, 0xF2F7, 0xF3F7, 0xF4F7, 0xF5F7, 0xF6F7,
- 0xF7F7, 0xF8F7, 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7,
- 0xFFF7, 0x00F7, 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7,
- 0x07F7, 0x08F7, 0x09F7, 0x0AF7, 0x0BF7, 0x0CF7, 0x0DF7, 0x0EF7,
- 0x0FF7, 0xF1F8, 0xF2F8, 0xF3F8, 0xF4F8, 0xF5F8, 0xF6F8, 0xF7F8,
- 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8,
- 0x00F8, 0x01F8, 0x02F8, 0x03F8, 0x04F8, 0x05F8, 0x06F8, 0x07F8,
- 0x08F8, 0x09F8, 0x0AF8, 0x0BF8, 0x0CF8, 0x0DF8, 0x0EF8, 0x0FF8,
- 0xF1F9, 0xF2F9, 0xF3F9, 0xF4F9, 0xF5F9, 0xF6F9, 0xF7F9, 0xF8F9,
- 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9,
- 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0x08F9,
- 0x09F9, 0x0AF9, 0x0BF9, 0x0CF9, 0x0DF9, 0x0EF9, 0x0FF9, 0xF1FA,
- 0xF2FA, 0xF3FA, 0xF4FA, 0xF5FA, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA,
- 0x0AFA, 0x0BFA, 0x0CFA, 0x0DFA, 0x0EFA, 0x0FFA, 0xF1FB, 0xF2FB,
- 0xF3FB, 0xF4FB, 0xF5FB, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB,
- 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB,
- 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB,
- 0x0BFB, 0x0CFB, 0x0DFB, 0x0EFB, 0x0FFB, 0xF1FC, 0xF2FC, 0xF3FC,
- 0xF4FC, 0xF5FC, 0xF6FC, 0xF7FC, 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC,
- 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC,
- 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0x08FC, 0x09FC, 0x0AFC, 0x0BFC,
- 0x0CFC, 0x0DFC, 0x0EFC, 0x0FFC, 0xF1FD, 0xF2FD, 0xF3FD, 0xF4FD,
- 0xF5FD, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD,
- 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD,
- 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD, 0x0BFD, 0x0CFD,
- 0x0DFD, 0x0EFD, 0x0FFD, 0xF1FE, 0xF2FE, 0xF3FE, 0xF4FE, 0xF5FE,
- 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0x0BFE, 0x0CFE, 0x0DFE,
- 0x0EFE, 0x0FFE, 0xF1FF, 0xF2FF, 0xF3FF, 0xF4FF, 0xF5FF, 0xF6FF,
- 0xF7FF, 0xF8FF, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF,
- 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF,
- 0x07FF, 0x08FF, 0x09FF, 0x0AFF, 0x0BFF, 0x0CFF, 0x0DFF, 0x0EFF,
- 0x0FFF, 0xF100, 0xF200, 0xF300, 0xF400, 0xF500, 0xF600, 0xF700,
- 0xF800, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00,
- 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
- 0x0800, 0x0900, 0x0A00, 0x0B00, 0x0C00, 0x0D00, 0x0E00, 0x0F00,
- 0xF101, 0xF201, 0xF301, 0xF401, 0xF501, 0xF601, 0xF701, 0xF801,
- 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001,
- 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0x0801,
- 0x0901, 0x0A01, 0x0B01, 0x0C01, 0x0D01, 0x0E01, 0x0F01, 0xF102,
- 0xF202, 0xF302, 0xF402, 0xF502, 0xF602, 0xF702, 0xF802, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902,
- 0x0A02, 0x0B02, 0x0C02, 0x0D02, 0x0E02, 0x0F02, 0xF103, 0xF203,
- 0xF303, 0xF403, 0xF503, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03,
- 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203,
- 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03,
- 0x0B03, 0x0C03, 0x0D03, 0x0E03, 0x0F03, 0xF104, 0xF204, 0xF304,
- 0xF404, 0xF504, 0xF604, 0xF704, 0xF804, 0xF904, 0xFA04, 0xFB04,
- 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304,
- 0x0404, 0x0504, 0x0604, 0x0704, 0x0804, 0x0904, 0x0A04, 0x0B04,
- 0x0C04, 0x0D04, 0x0E04, 0x0F04, 0xF105, 0xF205, 0xF305, 0xF405,
- 0xF505, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05, 0xFB05, 0xFC05,
- 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405,
- 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05, 0x0B05, 0x0C05,
- 0x0D05, 0x0E05, 0x0F05, 0xF106, 0xF206, 0xF306, 0xF406, 0xF506,
- 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0x0B06, 0x0C06, 0x0D06,
- 0x0E06, 0x0F06, 0xF107, 0xF207, 0xF307, 0xF407, 0xF507, 0xF607,
- 0xF707, 0xF807, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07,
- 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607,
- 0x0707, 0x0807, 0x0907, 0x0A07, 0x0B07, 0x0C07, 0x0D07, 0x0E07,
- 0x0F07, 0xF108, 0xF208, 0xF308, 0xF408, 0xF508, 0xF608, 0xF708,
- 0xF808, 0xF908, 0xFA08, 0xFB08, 0xFC08, 0xFD08, 0xFE08, 0xFF08,
- 0x0008, 0x0108, 0x0208, 0x0308, 0x0408, 0x0508, 0x0608, 0x0708,
- 0x0808, 0x0908, 0x0A08, 0x0B08, 0x0C08, 0x0D08, 0x0E08, 0x0F08,
- 0xF109, 0xF209, 0xF309, 0xF409, 0xF509, 0xF609, 0xF709, 0xF809,
- 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09, 0xFF09, 0x0009,
- 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609, 0x0709, 0x0809,
- 0x0909, 0x0A09, 0x0B09, 0x0C09, 0x0D09, 0x0E09, 0x0F09, 0xF10A,
- 0xF20A, 0xF30A, 0xF40A, 0xF50A, 0xF60A, 0xF70A, 0xF80A, 0xF90A,
- 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A,
- 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A,
- 0x0A0A, 0x0B0A, 0x0C0A, 0x0D0A, 0x0E0A, 0x0F0A, 0xF10B, 0xF20B,
- 0xF30B, 0xF40B, 0xF50B, 0xF60B, 0xF70B, 0xF80B, 0xF90B, 0xFA0B,
- 0xFB0B, 0xFC0B, 0xFD0B, 0xFE0B, 0xFF0B, 0x000B, 0x010B, 0x020B,
- 0x030B, 0x040B, 0x050B, 0x060B, 0x070B, 0x080B, 0x090B, 0x0A0B,
- 0x0B0B, 0x0C0B, 0x0D0B, 0x0E0B, 0x0F0B, 0xF10C, 0xF20C, 0xF30C,
- 0xF40C, 0xF50C, 0xF60C, 0xF70C, 0xF80C, 0xF90C, 0xFA0C, 0xFB0C,
- 0xFC0C, 0xFD0C, 0xFE0C, 0xFF0C, 0x000C, 0x010C, 0x020C, 0x030C,
- 0x040C, 0x050C, 0x060C, 0x070C, 0x080C, 0x090C, 0x0A0C, 0x0B0C,
- 0x0C0C, 0x0D0C, 0x0E0C, 0x0F0C, 0xF10D, 0xF20D, 0xF30D, 0xF40D,
- 0xF50D, 0xF60D, 0xF70D, 0xF80D, 0xF90D, 0xFA0D, 0xFB0D, 0xFC0D,
- 0xFD0D, 0xFE0D, 0xFF0D, 0x000D, 0x010D, 0x020D, 0x030D, 0x040D,
- 0x050D, 0x060D, 0x070D, 0x080D, 0x090D, 0x0A0D, 0x0B0D, 0x0C0D,
- 0x0D0D, 0x0E0D, 0x0F0D, 0xF10E, 0xF20E, 0xF30E, 0xF40E, 0xF50E,
- 0xF60E, 0xF70E, 0xF80E, 0xF90E, 0xFA0E, 0xFB0E, 0xFC0E, 0xFD0E,
- 0xFE0E, 0xFF0E, 0x000E, 0x010E, 0x020E, 0x030E, 0x040E, 0x050E,
- 0x060E, 0x070E, 0x080E, 0x090E, 0x0A0E, 0x0B0E, 0x0C0E, 0x0D0E,
- 0x0E0E, 0x0F0E, 0xF10F, 0xF20F, 0xF30F, 0xF40F, 0xF50F, 0xF60F,
- 0xF70F, 0xF80F, 0xF90F, 0xFA0F, 0xFB0F, 0xFC0F, 0xFD0F, 0xFE0F,
- 0xFF0F, 0x000F, 0x010F, 0x020F, 0x030F, 0x040F, 0x050F, 0x060F,
- 0x070F, 0x080F, 0x090F, 0x0A0F, 0x0B0F, 0x0C0F, 0x0D0F, 0x0E0F,
- 0x0F0F, 0x1010,
-];
-const CLV_MVY_2_ESCAPE: u16 = 0x1010;
-
-const CLV_BIASY_2_BITS: &[u8] = &[
- 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 12, 11,
- 11, 11, 10, 10, 10, 10, 9, 9, 8, 8, 8, 7, 6, 6, 4, 3,
- 1, 3, 4, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 11,
- 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16,
- 16, 15,
-];
-const CLV_BIASY_2_CODES: &[u16] = &[
- 0xFFFE, 0xFFFC, 0xFFFA, 0xFFF9, 0xFFF6, 0xFFF5, 0xFFF3, 0x7FF7,
- 0x7FF5, 0x7FF1, 0x7FF3, 0x7FF0, 0x7FEE, 0x7FEC, 0x7FE9, 0x7FE6,
- 0x7FE4, 0x7FE2, 0x3FEF, 0x3FEE, 0x3FEC, 0x3FEA, 0x1FF2, 0x1FF1,
- 0x1FEF, 0x1FED, 0x0FF4, 0x0FF3, 0x0FF1, 0x0FEF, 0x0FED, 0x07F4,
- 0x07F3, 0x07F1, 0x03F6, 0x03F4, 0x03F2, 0x03F0, 0x01F6, 0x01F4,
- 0x00F8, 0x00F6, 0x00F4, 0x0078, 0x003A, 0x0038, 0x000C, 0x0004,
- 0x0000, 0x0005, 0x000D, 0x0039, 0x003B, 0x0079, 0x00F5, 0x00F7,
- 0x00F9, 0x01F5, 0x01F7, 0x03F1, 0x03F3, 0x03F5, 0x03F7, 0x07F0,
- 0x07F2, 0x07F5, 0x0FEC, 0x0FEE, 0x0FF0, 0x0FF2, 0x0FF5, 0x1FEC,
- 0x1FEE, 0x1FF0, 0x1FF3, 0x1FF4, 0x3FEB, 0x3FED, 0x3FF0, 0x7FE3,
- 0x7FE5, 0x7FE7, 0x7FEA, 0x7FEB, 0x7FED, 0x7FEF, 0x7FF4, 0x7FF2,
- 0x7FF6, 0x7FF8, 0xFFF2, 0xFFF4, 0xFFF7, 0xFFF8, 0xFFFB, 0xFFFD,
- 0xFFFF, 0x7FE8,
-];
-const CLV_BIASY_2_SYMS: &[u16] = &[
- 0xFF40, 0xFF44, 0xFF48, 0xFF4C, 0xFF50, 0xFF54, 0xFF58, 0xFF5C,
- 0xFF60, 0xFF64, 0xFF68, 0xFF6C, 0xFF70, 0xFF74, 0xFF78, 0xFF7C,
- 0xFF80, 0xFF84, 0xFF88, 0xFF8C, 0xFF90, 0xFF94, 0xFF98, 0xFF9C,
- 0xFFA0, 0xFFA4, 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC,
- 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC,
- 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC,
- 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C,
- 0x0020, 0x0024, 0x0028, 0x002C, 0x0030, 0x0034, 0x0038, 0x003C,
- 0x0040, 0x0044, 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C,
- 0x0060, 0x0064, 0x0068, 0x006C, 0x0070, 0x0074, 0x0078, 0x007C,
- 0x0080, 0x0084, 0x0088, 0x008C, 0x0090, 0x0094, 0x0098, 0x009C,
- 0x00A0, 0x00A4, 0x00A8, 0x00AC, 0x00B0, 0x00B4, 0x00B8, 0x00BC,
- 0x00C0, 0x0100,
-];
-
-const CLV_FLAGSY_2_BITS: &[u8] = &[
- 1, 4, 4, 4, 4, 5, 7, 5, 4, 6, 5, 8, 4, 9, 10, 10,
-];
-const CLV_FLAGSY_2_CODES: &[u16] = &[
- 0x0000, 0x000C, 0x000B, 0x0008, 0x000A, 0x001C, 0x007E, 0x001D,
- 0x000D, 0x003E, 0x001E, 0x00FE, 0x0009, 0x01FE, 0x03FE, 0x03FF,
-];
-
-const CLV_MVY_3_BITS: &[u8] = &[
- 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 13,
- 13, 12, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15,
- 15, 15, 14, 14, 14, 13, 12, 11, 12, 13, 14, 14, 14, 15, 15, 15,
- 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15,
- 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 12, 11, 12, 14, 14,
- 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16,
- 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13,
- 12, 11, 12, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15,
- 15, 16, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 13, 13, 12, 10, 12, 13, 13, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 15, 15, 15, 15,
- 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 12, 10, 12, 12, 13, 13,
- 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 15, 15,
- 15, 15, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 11,
- 10, 11, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15,
- 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12,
- 12, 12, 12, 11, 10, 9, 10, 11, 12, 12, 12, 12, 12, 13, 13, 13,
- 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13,
- 12, 12, 12, 12, 12, 12, 12, 11, 11, 10, 9, 10, 11, 11, 12, 12,
- 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 16, 15, 15,
- 15, 15, 14, 14, 13, 13, 12, 12, 12, 12, 12, 11, 11, 11, 10, 9,
- 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15,
- 15, 16, 15, 15, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12,
- 11, 11, 11, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13,
- 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12,
- 12, 12, 12, 12, 12, 11, 11, 11, 10, 8, 10, 11, 11, 11, 12, 12,
- 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 14, 14,
- 14, 14, 13, 13, 12, 12, 12, 12, 12, 11, 11, 11, 10, 10, 8, 10,
- 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15,
- 15, 15, 14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11,
- 10, 10, 9, 7, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13,
- 13, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, 13, 12, 12,
- 12, 12, 11, 11, 11, 10, 10, 9, 7, 9, 10, 10, 11, 11, 11, 12,
- 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14,
- 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 7, 9, 9,
- 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15,
- 15, 14, 14, 14, 13, 13, 13, 13, 12, 11, 11, 11, 11, 10, 10, 10,
- 9, 8, 6, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13, 13,
- 13, 14, 14, 14, 15, 15, 14, 14, 14, 13, 13, 12, 12, 11, 11, 11,
- 11, 10, 10, 9, 9, 8, 6, 4, 6, 8, 9, 9, 10, 10, 11, 11,
- 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 13, 13, 13, 12, 12, 12,
- 12, 11, 10, 10, 10, 10, 9, 9, 8, 8, 7, 5, 2, 5, 7, 8,
- 8, 9, 9, 10, 10, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 15,
- 14, 14, 14, 13, 13, 12, 12, 11, 11, 11, 11, 10, 10, 9, 9, 8,
- 6, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 12, 13, 13,
- 14, 14, 14, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 11, 11, 11,
- 11, 10, 10, 10, 9, 8, 6, 8, 9, 10, 10, 10, 11, 11, 11, 11,
- 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 14, 14, 14, 14, 13, 13,
- 12, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 7, 9, 9, 10, 11,
- 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 14,
- 14, 14, 14, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 10, 10, 9,
- 7, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14,
- 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 12, 11,
- 11, 11, 10, 10, 9, 7, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12,
- 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 14, 14, 14, 14, 13, 13,
- 12, 12, 12, 12, 12, 11, 11, 11, 10, 10, 8, 10, 10, 11, 11, 11,
- 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15,
- 14, 14, 14, 13, 13, 12, 12, 12, 12, 12, 12, 11, 11, 11, 10, 8,
- 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 15,
- 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12,
- 11, 11, 11, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13,
- 14, 14, 14, 14, 14, 15, 15, 16, 15, 15, 15, 15, 14, 14, 13, 13,
- 12, 12, 12, 12, 12, 11, 11, 11, 10, 9, 10, 11, 11, 11, 12, 12,
- 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 15, 15, 15, 14,
- 14, 14, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 10, 9, 10,
- 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15,
- 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12,
- 12, 11, 10, 9, 10, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14,
- 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14,
- 13, 13, 13, 13, 13, 13, 13, 11, 10, 11, 13, 13, 13, 13, 13, 13,
- 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 15, 15,
- 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 12, 10, 12, 12,
- 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16,
- 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,
- 13, 12, 10, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15,
- 15, 15, 15, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 14,
- 14, 14, 14, 14, 13, 13, 12, 11, 12, 13, 13, 14, 14, 14, 14, 14,
- 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 15, 15, 15,
- 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 12, 11, 12, 14, 14,
- 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13,
- 12, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15,
- 15, 14, 14, 13, 13, 12, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15,
- 15, 15, 16, 16, 16, 16, 16, 16, 16, 7,
-];
-const CLV_MVY_3_CODES: &[u16] = &[
- 0xFFF6, 0xFFEE, 0xFFDC, 0xFFD7, 0xFFB4, 0xFFAA, 0xFFA0, 0x7FCC,
- 0x7F8E, 0x7F7B, 0x7F77, 0x7F13, 0x7F11, 0x3F56, 0x3F48, 0x1F16,
- 0x1E94, 0x0F28, 0x06F0, 0x0F2A, 0x1E96, 0x1F1C, 0x3F46, 0x3F58,
- 0x7F15, 0x7F0E, 0x7F76, 0x7F80, 0x7F90, 0x7FC8, 0xFFA2, 0xFFA7,
- 0xFFB5, 0xFFD8, 0xFFDD, 0xFFEC, 0xFFF5, 0xFFF1, 0xFFEA, 0xFFE4,
- 0xFFD1, 0xFFC1, 0xFFA8, 0x7F70, 0x7F5C, 0x7F44, 0x7F40, 0x7F2A,
- 0x7F16, 0x7EDF, 0x3ED6, 0x3ECA, 0x3ECC, 0x1EB5, 0x0EDE, 0x06D3,
- 0x0EDF, 0x1EB6, 0x3ECE, 0x3ED0, 0x3ED8, 0x7EE5, 0x7F19, 0x7F31,
- 0x7F3E, 0x7F45, 0x7F5B, 0x7F6F, 0xFFA9, 0xFFC0, 0xFFCE, 0xFFE5,
- 0xFFE8, 0xFFF2, 0xFFFE, 0xFFE2, 0xFFBE, 0x7FBB, 0x7F75, 0x7F6B,
- 0x7F58, 0x7EF9, 0x7EDC, 0x3F68, 0x3F27, 0x3F28, 0x3EDF, 0x3ED2,
- 0x3EC1, 0x3EA6, 0x3E87, 0x0F0F, 0x06B3, 0x0F10, 0x3E89, 0x3EA8,
- 0x3EC3, 0x3ED5, 0x3EE0, 0x3F2B, 0x3F26, 0x3F67, 0x7EDA, 0x7EFB,
- 0x7F56, 0x7F6A, 0x7F72, 0x7FC1, 0xFFBC, 0xFFE0, 0xFFFF, 0xFFF8,
- 0xFFD3, 0xFFB9, 0x7FAC, 0x7F94, 0x7F8B, 0x7F62, 0x7F4A, 0x7F05,
- 0x7EEE, 0x3F44, 0x3EA4, 0x3E78, 0x3E6F, 0x3E54, 0x1EEF, 0x1EA9,
- 0x0ED4, 0x06A8, 0x0ED5, 0x1EA8, 0x1EEC, 0x3E51, 0x3E69, 0x3E75,
- 0x3EA3, 0x3F43, 0x7EF1, 0x7F04, 0x7F4B, 0x7F5D, 0x7F89, 0x7F95,
- 0x7FAA, 0xFFBB, 0xFFC8, 0xFFF9, 0xFFD9, 0xFFCA, 0x7FC3, 0x7F8C,
- 0x7F38, 0x7F02, 0x3F5A, 0x3F4A, 0x3F30, 0x3EFF, 0x3EF4, 0x3EE9,
- 0x3E95, 0x3E73, 0x3E43, 0x1F08, 0x1E81, 0x0E84, 0x0349, 0x0E85,
- 0x1E82, 0x1F07, 0x3E45, 0x3E74, 0x3E96, 0x3EEA, 0x3EF1, 0x3F00,
- 0x3F32, 0x3F4F, 0x3F5C, 0x7F01, 0x7F3B, 0x7F8D, 0x7FC2, 0xFFCF,
- 0xFFD6, 0xFFC7, 0xFFB1, 0xFFA6, 0x7FA1, 0x7F2F, 0x7F24, 0x7F0A,
- 0x3EF6, 0x3E97, 0x3E83, 0x3E7F, 0x1F04, 0x1EE1, 0x1ECB, 0x1EAE,
- 0x1E7E, 0x0EBA, 0x0E8C, 0x0333, 0x0E8D, 0x0EBB, 0x1E7F, 0x1EAF,
- 0x1ECC, 0x1EE2, 0x1F05, 0x3E80, 0x3E84, 0x3E98, 0x3EF9, 0x7F06,
- 0x7F1B, 0x7F2D, 0x7F9F, 0xFFAF, 0xFFB0, 0xFFC6, 0x7FB5, 0x7FB1,
- 0x7F36, 0x7F25, 0x3F63, 0x3F3A, 0x3F1B, 0x3EBB, 0x3E63, 0x3E5B,
- 0x3E40, 0x1F14, 0x1EF5, 0x1EEB, 0x1EBE, 0x1E92, 0x1E6A, 0x070C,
- 0x032D, 0x070D, 0x1E6B, 0x1E93, 0x1EBF, 0x1EE8, 0x1EF3, 0x1F15,
- 0x3E3F, 0x3E5C, 0x3E64, 0x3EB9, 0x3F1C, 0x3F3C, 0x3F62, 0x7F22,
- 0x7F39, 0x7FAF, 0x7FAE, 0x7FC6, 0x7F7F, 0x7F53, 0x7F32, 0x3F66,
- 0x3EF0, 0x3E65, 0x1EDA, 0x1ED3, 0x1E98, 0x1E74, 0x0F20, 0x0F1D,
- 0x0EEA, 0x0EA9, 0x0E70, 0x0718, 0x033E, 0x0179, 0x033F, 0x0719,
- 0x0E71, 0x0EAB, 0x0EE9, 0x0F1F, 0x0F22, 0x1E76, 0x1E9B, 0x1ED5,
- 0x1EDD, 0x3E68, 0x3EF3, 0x3F6C, 0x7F33, 0x7F4E, 0x7F7D, 0x7FCB,
- 0x7FBD, 0x7F21, 0x7EF6, 0x3F0C, 0x3EBE, 0x3EAE, 0x1EA3, 0x1E85,
- 0x0F0C, 0x0F06, 0x0EEE, 0x0EE6, 0x0ECA, 0x0EA2, 0x0E78, 0x0720,
- 0x06BA, 0x0326, 0x015D, 0x0327, 0x06BB, 0x0721, 0x0E79, 0x0EA3,
- 0x0ECB, 0x0EE7, 0x0EEF, 0x0F07, 0x0F0D, 0x1E86, 0x1EA4, 0x3EAF,
- 0x3EBF, 0x3F0A, 0x7EF8, 0x7F1E, 0x7FBF, 0xFF9F, 0x7FB3, 0x7F96,
- 0x7F0B, 0x7EF5, 0x3E85, 0x3E4E, 0x1EB3, 0x1E6E, 0x0F2D, 0x0EBD,
- 0x0E97, 0x0E93, 0x0E86, 0x071A, 0x06E4, 0x06BC, 0x0338, 0x015A,
- 0x0339, 0x06BD, 0x06E5, 0x071B, 0x0E87, 0x0E94, 0x0E98, 0x0EBE,
- 0x0F2E, 0x1E6F, 0x1EB4, 0x3E4F, 0x3E88, 0x7EF4, 0x7F07, 0x7F99,
- 0x7FB7, 0xFF9D, 0x7FA8, 0x7EEB, 0x3F5D, 0x3EB2, 0x3EAA, 0x3E5D,
- 0x3E49, 0x1EFE, 0x1E89, 0x0F16, 0x0F12, 0x0EE0, 0x0E7A, 0x0E6A,
- 0x070E, 0x06FA, 0x06B4, 0x0314, 0x0158, 0x0315, 0x06B5, 0x06FB,
- 0x070F, 0x0E6B, 0x0E7B, 0x0EE1, 0x0F13, 0x0F17, 0x1E8A, 0x1EFF,
- 0x3E4A, 0x3E5E, 0x3EAB, 0x3EB3, 0x3F59, 0x7EEC, 0x7FA2, 0x7F82,
- 0x7F5E, 0x7F28, 0x3EDA, 0x3EC9, 0x3E7A, 0x1ED6, 0x1ECE, 0x0EFC,
- 0x0EF0, 0x0E9A, 0x0E7E, 0x0E66, 0x0E5E, 0x0722, 0x06C0, 0x06A0,
- 0x02FA, 0x00A8, 0x02FB, 0x06A1, 0x06C1, 0x0723, 0x0E5F, 0x0E67,
- 0x0E7F, 0x0E9B, 0x0EF1, 0x0EFD, 0x1ECF, 0x1ED7, 0x3E79, 0x3ECD,
- 0x3EDB, 0x7F26, 0x7F5A, 0x7F83, 0x7F54, 0x7EE8, 0x3F54, 0x3F0E,
- 0x3EFB, 0x3E47, 0x1EC1, 0x1EB9, 0x0EF9, 0x0EF3, 0x0EC1, 0x0E8F,
- 0x0E74, 0x0714, 0x06F4, 0x06B0, 0x0336, 0x030A, 0x009F, 0x030B,
- 0x0337, 0x06B1, 0x06F5, 0x0715, 0x0E75, 0x0E91, 0x0EC3, 0x0EF6,
- 0x0EFB, 0x1EBB, 0x1EC3, 0x3E41, 0x3EF8, 0x3F10, 0x3F4D, 0x7EE9,
- 0x7F52, 0x7F9A, 0x3F3F, 0x3F1F, 0x3F03, 0x3EA0, 0x1F0F, 0x1E72,
- 0x1E62, 0x0EDA, 0x0ED2, 0x0EB2, 0x0E64, 0x0708, 0x06EA, 0x06DA,
- 0x0346, 0x032A, 0x0176, 0x004B, 0x0177, 0x032B, 0x0347, 0x06DB,
- 0x06EB, 0x0709, 0x0E65, 0x0EB3, 0x0ED3, 0x0EDB, 0x1E63, 0x1E6C,
- 0x1F0E, 0x3E9E, 0x3F01, 0x3F1D, 0x3F3D, 0x7F9B, 0x7EDE, 0x3F36,
- 0x3F2E, 0x3F07, 0x3E99, 0x1F0D, 0x1EA1, 0x1E8C, 0x0EB4, 0x0EAC,
- 0x0E5A, 0x0E50, 0x0702, 0x06D4, 0x06C6, 0x032E, 0x0310, 0x0162,
- 0x0046, 0x0163, 0x0311, 0x032F, 0x06C7, 0x06D5, 0x0703, 0x0E51,
- 0x0E5B, 0x0EAD, 0x0EB5, 0x1E8F, 0x1EA7, 0x1F0C, 0x3E9A, 0x3F02,
- 0x3F2D, 0x3F35, 0x7EE0, 0x7F66, 0x3F11, 0x3EE1, 0x3EBC, 0x3E56,
- 0x1EC4, 0x1E64, 0x0F04, 0x0EC7, 0x0E56, 0x0E4C, 0x06EC, 0x06DC,
- 0x069C, 0x0694, 0x0320, 0x016C, 0x0154, 0x0044, 0x0155, 0x016D,
- 0x0321, 0x0695, 0x069D, 0x06DD, 0x06ED, 0x0E4D, 0x0E57, 0x0EC4,
- 0x0F05, 0x1E65, 0x1EC5, 0x3E55, 0x3EB7, 0x3EE3, 0x3F13, 0x7F67,
- 0x7FA7, 0x3F49, 0x3F22, 0x3EE5, 0x1EF6, 0x1EE5, 0x1E9C, 0x1E78,
- 0x0EA4, 0x06F6, 0x06DE, 0x06CE, 0x06AA, 0x0340, 0x0318, 0x02FE,
- 0x015E, 0x009A, 0x001C, 0x009B, 0x015F, 0x02FF, 0x0319, 0x0341,
- 0x06AB, 0x06CF, 0x06DF, 0x06F7, 0x0EA5, 0x1E79, 0x1E9D, 0x1EE7,
- 0x1EF7, 0x3EE6, 0x3F23, 0x3F4B, 0x7FA3, 0x7F49, 0x3F14, 0x3E8D,
- 0x3E6B, 0x1F17, 0x1EF8, 0x0F24, 0x0ECC, 0x06FE, 0x06CA, 0x06A4,
- 0x0698, 0x030C, 0x0302, 0x0170, 0x0168, 0x00A0, 0x001E, 0x0004,
- 0x001F, 0x00A1, 0x0169, 0x0171, 0x0303, 0x030D, 0x0699, 0x06A5,
- 0x06CB, 0x06FF, 0x0ECD, 0x0F25, 0x1EF9, 0x1F18, 0x3E6C, 0x3E8E,
- 0x3F15, 0x7F46, 0x1EF0, 0x1EDE, 0x1EC8, 0x0F1A, 0x0F00, 0x0E9E,
- 0x0E54, 0x06C4, 0x031E, 0x031C, 0x0306, 0x02F8, 0x017A, 0x0166,
- 0x00A6, 0x00A4, 0x0048, 0x000C, 0x0000, 0x000D, 0x0049, 0x00A5,
- 0x00A7, 0x0167, 0x017B, 0x02F9, 0x0307, 0x031D, 0x031F, 0x06C5,
- 0x0E55, 0x0E9F, 0x0F01, 0x0F1B, 0x1EC9, 0x1EDF, 0x1EF1, 0x7F47,
- 0x3F12, 0x3E8F, 0x3E6D, 0x1F1B, 0x1EFA, 0x0F26, 0x0ECE, 0x0700,
- 0x06CC, 0x06A6, 0x069A, 0x030E, 0x0304, 0x0172, 0x016A, 0x00A2,
- 0x0020, 0x0005, 0x0021, 0x00A3, 0x016B, 0x0173, 0x0305, 0x030F,
- 0x069B, 0x06A7, 0x06CD, 0x0701, 0x0ECF, 0x0F27, 0x1EFB, 0x1F1D,
- 0x3E6E, 0x3E90, 0x3F17, 0x7F48, 0x7FA9, 0x3F50, 0x3F24, 0x3EE7,
- 0x1EFC, 0x1EE9, 0x1E9E, 0x1E7A, 0x0EA6, 0x06F8, 0x06E0, 0x06D0,
- 0x06AC, 0x0342, 0x031A, 0x0300, 0x0160, 0x009C, 0x001D, 0x009D,
- 0x0161, 0x0301, 0x031B, 0x0343, 0x06AD, 0x06D1, 0x06E1, 0x06F9,
- 0x0EA7, 0x1E7B, 0x1E9F, 0x1EEA, 0x1EFD, 0x3EE8, 0x3F21, 0x3F52,
- 0x7F9E, 0x7F68, 0x3F16, 0x3EE2, 0x3EBA, 0x3E57, 0x1EC6, 0x1E66,
- 0x0F08, 0x0EC5, 0x0E58, 0x0E4E, 0x06EE, 0x06E2, 0x069E, 0x0696,
- 0x0322, 0x016E, 0x0156, 0x0045, 0x0157, 0x016F, 0x0323, 0x0697,
- 0x069F, 0x06E3, 0x06EF, 0x0E4F, 0x0E59, 0x0EC6, 0x0F09, 0x1E67,
- 0x1EC7, 0x3E58, 0x3EB8, 0x3EE4, 0x3F18, 0x7F69, 0x7EE2, 0x3F38,
- 0x3F33, 0x3F04, 0x3E9C, 0x1F0A, 0x1EA5, 0x1E8D, 0x0EB6, 0x0EAE,
- 0x0E5C, 0x0E52, 0x0704, 0x06D6, 0x06C8, 0x0330, 0x0312, 0x0164,
- 0x0047, 0x0165, 0x0313, 0x0331, 0x06C9, 0x06D7, 0x0705, 0x0E53,
- 0x0E5D, 0x0EAF, 0x0EB7, 0x1E8E, 0x1EA6, 0x1F0B, 0x3E9B, 0x3F05,
- 0x3F31, 0x3F39, 0x7EE1, 0x7F9C, 0x3F40, 0x3F1E, 0x3F06, 0x3E9D,
- 0x1F10, 0x1E70, 0x1E60, 0x0ED8, 0x0ED0, 0x0EB0, 0x0E62, 0x0706,
- 0x06E8, 0x06D8, 0x0344, 0x0328, 0x0174, 0x004A, 0x0175, 0x0329,
- 0x0345, 0x06D9, 0x06E9, 0x0707, 0x0E63, 0x0EB1, 0x0ED1, 0x0ED9,
- 0x1E61, 0x1E71, 0x1F11, 0x3E9F, 0x3F08, 0x3F20, 0x3F3E, 0x7F9D,
- 0x7F4F, 0x7EE6, 0x3F53, 0x3F0D, 0x3EFA, 0x3E46, 0x1EC0, 0x1EB8,
- 0x0EF8, 0x0EF2, 0x0EC0, 0x0E8E, 0x0E72, 0x0712, 0x06F2, 0x06AE,
- 0x0334, 0x0308, 0x009E, 0x0309, 0x0335, 0x06AF, 0x06F3, 0x0713,
- 0x0E73, 0x0E90, 0x0EC2, 0x0EF4, 0x0EFA, 0x1EBA, 0x1EC2, 0x3E48,
- 0x3EFC, 0x3F0B, 0x3F51, 0x7EE7, 0x7F51, 0x7F84, 0x7F61, 0x7F27,
- 0x3EDC, 0x3EC5, 0x3E7C, 0x1ED8, 0x1ED0, 0x0EFE, 0x0EF5, 0x0E9C,
- 0x0E80, 0x0E68, 0x0E60, 0x0724, 0x06C2, 0x06A2, 0x02FC, 0x00A9,
- 0x02FD, 0x06A3, 0x06C3, 0x0725, 0x0E61, 0x0E69, 0x0E81, 0x0E9D,
- 0x0EF7, 0x0EFF, 0x1ED1, 0x1ED9, 0x3E7B, 0x3ECF, 0x3ED9, 0x7F29,
- 0x7F65, 0x7F85, 0x7FA0, 0x7EEA, 0x3F60, 0x3EB4, 0x3EAC, 0x3E5F,
- 0x3E4B, 0x1F00, 0x1E8B, 0x0F18, 0x0F14, 0x0EE2, 0x0E7C, 0x0E6C,
- 0x0710, 0x06FC, 0x06B6, 0x0316, 0x0159, 0x0317, 0x06B7, 0x06FD,
- 0x0711, 0x0E6D, 0x0E7D, 0x0EE3, 0x0F15, 0x0F19, 0x1E88, 0x1F01,
- 0x3E4C, 0x3E60, 0x3EA9, 0x3EB1, 0x3F5B, 0x7EED, 0x7FA5, 0xFF9E,
- 0x7FBE, 0x7F98, 0x7F0D, 0x7EF3, 0x3E8C, 0x3E50, 0x1EB7, 0x1E73,
- 0x0F2F, 0x0EBF, 0x0E99, 0x0E95, 0x0E88, 0x071C, 0x06E6, 0x06BE,
- 0x033A, 0x015B, 0x033B, 0x06BF, 0x06E7, 0x071D, 0x0E89, 0x0E92,
- 0x0E96, 0x0EBC, 0x0F2C, 0x1E6D, 0x1EB0, 0x3E4D, 0x3E8B, 0x7EF2,
- 0x7F08, 0x7F97, 0x7FB0, 0xFF9C, 0x7FB2, 0x7F23, 0x7EFA, 0x3F0F,
- 0x3EBD, 0x3EAD, 0x1EA0, 0x1E87, 0x0F0A, 0x0F02, 0x0EED, 0x0EE4,
- 0x0EC8, 0x0EA0, 0x0E76, 0x071E, 0x06B8, 0x0324, 0x015C, 0x0325,
- 0x06B9, 0x071F, 0x0E77, 0x0EA1, 0x0EC9, 0x0EE5, 0x0EEC, 0x0F03,
- 0x0F0B, 0x1E84, 0x1EA2, 0x3EB0, 0x3EC4, 0x3F09, 0x7EF7, 0x7F1D,
- 0x7FBC, 0x7FCD, 0x7F81, 0x7F50, 0x7F34, 0x3F65, 0x3EED, 0x3E67,
- 0x1EDB, 0x1ED2, 0x1E99, 0x1E77, 0x0F21, 0x0F1C, 0x0EE8, 0x0EA8,
- 0x0E6E, 0x0716, 0x033C, 0x0178, 0x033D, 0x0717, 0x0E6F, 0x0EAA,
- 0x0EEB, 0x0F1E, 0x0F23, 0x1E75, 0x1E9A, 0x1ED4, 0x1EDC, 0x3E66,
- 0x3EEE, 0x3F6B, 0x7F35, 0x7F55, 0x7F7A, 0x7FCA, 0x7FB6, 0x7FB8,
- 0x7F37, 0x7F1F, 0x3F61, 0x3F37, 0x3F1A, 0x3EB5, 0x3E62, 0x3E5A,
- 0x1F1E, 0x1F13, 0x1EF2, 0x1EE6, 0x1EBC, 0x1E91, 0x1E68, 0x070A,
- 0x032C, 0x070B, 0x1E69, 0x1E90, 0x1EBD, 0x1EE4, 0x1EF4, 0x1F12,
- 0x3E3E, 0x3E59, 0x3E61, 0x3EB6, 0x3F19, 0x3F3B, 0x3F64, 0x7F1C,
- 0x7F3D, 0x7FB4, 0x7FB9, 0xFFC5, 0xFFB6, 0xFFAD, 0x7FA4, 0x7F2C,
- 0x7F20, 0x7F09, 0x3EF5, 0x3E93, 0x3E82, 0x3E7E, 0x1F02, 0x1EE3,
- 0x1ECA, 0x1EAD, 0x1E7C, 0x0EB8, 0x0E8A, 0x0332, 0x0E8B, 0x0EB9,
- 0x1E7D, 0x1EAC, 0x1ECD, 0x1EE0, 0x1F03, 0x3E7D, 0x3E81, 0x3E91,
- 0x3EF7, 0x7F0C, 0x7F1A, 0x7F2E, 0x7FA6, 0xFFA4, 0xFFB7, 0xFFC4,
- 0xFFD4, 0xFFCC, 0x7FC5, 0x7F8A, 0x7F3C, 0x7EFF, 0x3F5E, 0x3F4E,
- 0x3F2F, 0x3EFD, 0x3EEF, 0x3EEB, 0x3E92, 0x3E71, 0x3E42, 0x1F09,
- 0x1E83, 0x0E82, 0x0348, 0x0E83, 0x1E80, 0x1F06, 0x3E44, 0x3E72,
- 0x3E94, 0x3EEC, 0x3EF2, 0x3EFE, 0x3F34, 0x3F4C, 0x3F5F, 0x7EFE,
- 0x7F3A, 0x7F86, 0x7FC4, 0xFFD2, 0xFFD5, 0xFFFA, 0xFFCD, 0xFFBA,
- 0x7FAB, 0x7F92, 0x7F87, 0x7F63, 0x7F4C, 0x7F03, 0x7EF0, 0x3F42,
- 0x3EA1, 0x3E76, 0x3E6A, 0x3E52, 0x1EEE, 0x1EAB, 0x0ED6, 0x06A9,
- 0x0ED7, 0x1EAA, 0x1EED, 0x3E53, 0x3E70, 0x3E77, 0x3EA2, 0x3F41,
- 0x7EEF, 0x7F00, 0x7F4D, 0x7F60, 0x7F88, 0x7F93, 0x7FAD, 0xFFB8,
- 0xFFCB, 0xFFFB, 0xFFFC, 0xFFE1, 0xFFBF, 0x7FBA, 0x7F73, 0x7F6C,
- 0x7F57, 0x7EFC, 0x7EDD, 0x3F6A, 0x3F2A, 0x3F25, 0x3EDD, 0x3ED3,
- 0x3EC2, 0x3EA7, 0x3E86, 0x0F11, 0x06B2, 0x0F0E, 0x3E8A, 0x3EA5,
- 0x3EC0, 0x3ED1, 0x3EDE, 0x3F2C, 0x3F29, 0x3F69, 0x7EDB, 0x7EFD,
- 0x7F59, 0x7F6D, 0x7F74, 0x7FC0, 0xFFC3, 0xFFE3, 0xFFFD, 0xFFF0,
- 0xFFE9, 0xFFE7, 0xFFC9, 0xFFBD, 0xFFAE, 0x7F71, 0x7F5F, 0x7F42,
- 0x7F41, 0x7F30, 0x7F17, 0x7EE4, 0x3ED7, 0x3EC7, 0x3ECB, 0x1EB1,
- 0x0EDC, 0x06D2, 0x0EDD, 0x1EB2, 0x3EC6, 0x3EC8, 0x3ED4, 0x7EE3,
- 0x7F18, 0x7F2B, 0x7F3F, 0x7F43, 0x7F64, 0x7F6E, 0xFFAB, 0xFFC2,
- 0xFFD0, 0xFFE6, 0xFFEF, 0xFFF3, 0xFFF7, 0xFFEB, 0xFFDE, 0xFFDA,
- 0xFFB3, 0xFFAC, 0xFFA3, 0x7FC9, 0x7F8F, 0x7F7C, 0x7F79, 0x7F0F,
- 0x7F10, 0x3F55, 0x3F45, 0x1F1A, 0x1E95, 0x0F2B, 0x06F1, 0x0F29,
- 0x1E97, 0x1F19, 0x3F47, 0x3F57, 0x7F14, 0x7F12, 0x7F78, 0x7F7E,
- 0x7F91, 0x7FC7, 0xFFA1, 0xFFA5, 0xFFB2, 0xFFDB, 0xFFDF, 0xFFED,
- 0xFFF4, 0x004C,
-];
-const CLV_MVY_3_SYMS: &[u16] = &[
- 0xEEEE, 0xEFEE, 0xF0EE, 0xF1EE, 0xF2EE, 0xF3EE, 0xF4EE, 0xF5EE,
- 0xF6EE, 0xF7EE, 0xF8EE, 0xF9EE, 0xFAEE, 0xFBEE, 0xFCEE, 0xFDEE,
- 0xFEEE, 0xFFEE, 0x00EE, 0x01EE, 0x02EE, 0x03EE, 0x04EE, 0x05EE,
- 0x06EE, 0x07EE, 0x08EE, 0x09EE, 0x0AEE, 0x0BEE, 0x0CEE, 0x0DEE,
- 0x0EEE, 0x0FEE, 0x10EE, 0x11EE, 0x12EE, 0xEEEF, 0xEFEF, 0xF0EF,
- 0xF1EF, 0xF2EF, 0xF3EF, 0xF4EF, 0xF5EF, 0xF6EF, 0xF7EF, 0xF8EF,
- 0xF9EF, 0xFAEF, 0xFBEF, 0xFCEF, 0xFDEF, 0xFEEF, 0xFFEF, 0x00EF,
- 0x01EF, 0x02EF, 0x03EF, 0x04EF, 0x05EF, 0x06EF, 0x07EF, 0x08EF,
- 0x09EF, 0x0AEF, 0x0BEF, 0x0CEF, 0x0DEF, 0x0EEF, 0x0FEF, 0x10EF,
- 0x11EF, 0x12EF, 0xEEF0, 0xEFF0, 0xF0F0, 0xF1F0, 0xF2F0, 0xF3F0,
- 0xF4F0, 0xF5F0, 0xF6F0, 0xF7F0, 0xF8F0, 0xF9F0, 0xFAF0, 0xFBF0,
- 0xFCF0, 0xFDF0, 0xFEF0, 0xFFF0, 0x00F0, 0x01F0, 0x02F0, 0x03F0,
- 0x04F0, 0x05F0, 0x06F0, 0x07F0, 0x08F0, 0x09F0, 0x0AF0, 0x0BF0,
- 0x0CF0, 0x0DF0, 0x0EF0, 0x0FF0, 0x10F0, 0x11F0, 0x12F0, 0xEEF1,
- 0xEFF1, 0xF0F1, 0xF1F1, 0xF2F1, 0xF3F1, 0xF4F1, 0xF5F1, 0xF6F1,
- 0xF7F1, 0xF8F1, 0xF9F1, 0xFAF1, 0xFBF1, 0xFCF1, 0xFDF1, 0xFEF1,
- 0xFFF1, 0x00F1, 0x01F1, 0x02F1, 0x03F1, 0x04F1, 0x05F1, 0x06F1,
- 0x07F1, 0x08F1, 0x09F1, 0x0AF1, 0x0BF1, 0x0CF1, 0x0DF1, 0x0EF1,
- 0x0FF1, 0x10F1, 0x11F1, 0x12F1, 0xEEF2, 0xEFF2, 0xF0F2, 0xF1F2,
- 0xF2F2, 0xF3F2, 0xF4F2, 0xF5F2, 0xF6F2, 0xF7F2, 0xF8F2, 0xF9F2,
- 0xFAF2, 0xFBF2, 0xFCF2, 0xFDF2, 0xFEF2, 0xFFF2, 0x00F2, 0x01F2,
- 0x02F2, 0x03F2, 0x04F2, 0x05F2, 0x06F2, 0x07F2, 0x08F2, 0x09F2,
- 0x0AF2, 0x0BF2, 0x0CF2, 0x0DF2, 0x0EF2, 0x0FF2, 0x10F2, 0x11F2,
- 0x12F2, 0xEEF3, 0xEFF3, 0xF0F3, 0xF1F3, 0xF2F3, 0xF3F3, 0xF4F3,
- 0xF5F3, 0xF6F3, 0xF7F3, 0xF8F3, 0xF9F3, 0xFAF3, 0xFBF3, 0xFCF3,
- 0xFDF3, 0xFEF3, 0xFFF3, 0x00F3, 0x01F3, 0x02F3, 0x03F3, 0x04F3,
- 0x05F3, 0x06F3, 0x07F3, 0x08F3, 0x09F3, 0x0AF3, 0x0BF3, 0x0CF3,
- 0x0DF3, 0x0EF3, 0x0FF3, 0x10F3, 0x11F3, 0x12F3, 0xEEF4, 0xEFF4,
- 0xF0F4, 0xF1F4, 0xF2F4, 0xF3F4, 0xF4F4, 0xF5F4, 0xF6F4, 0xF7F4,
- 0xF8F4, 0xF9F4, 0xFAF4, 0xFBF4, 0xFCF4, 0xFDF4, 0xFEF4, 0xFFF4,
- 0x00F4, 0x01F4, 0x02F4, 0x03F4, 0x04F4, 0x05F4, 0x06F4, 0x07F4,
- 0x08F4, 0x09F4, 0x0AF4, 0x0BF4, 0x0CF4, 0x0DF4, 0x0EF4, 0x0FF4,
- 0x10F4, 0x11F4, 0x12F4, 0xEEF5, 0xEFF5, 0xF0F5, 0xF1F5, 0xF2F5,
- 0xF3F5, 0xF4F5, 0xF5F5, 0xF6F5, 0xF7F5, 0xF8F5, 0xF9F5, 0xFAF5,
- 0xFBF5, 0xFCF5, 0xFDF5, 0xFEF5, 0xFFF5, 0x00F5, 0x01F5, 0x02F5,
- 0x03F5, 0x04F5, 0x05F5, 0x06F5, 0x07F5, 0x08F5, 0x09F5, 0x0AF5,
- 0x0BF5, 0x0CF5, 0x0DF5, 0x0EF5, 0x0FF5, 0x10F5, 0x11F5, 0x12F5,
- 0xEEF6, 0xEFF6, 0xF0F6, 0xF1F6, 0xF2F6, 0xF3F6, 0xF4F6, 0xF5F6,
- 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6,
- 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6,
- 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0x0BF6, 0x0CF6, 0x0DF6,
- 0x0EF6, 0x0FF6, 0x10F6, 0x11F6, 0x12F6, 0xEEF7, 0xEFF7, 0xF0F7,
- 0xF1F7, 0xF2F7, 0xF3F7, 0xF4F7, 0xF5F7, 0xF6F7, 0xF7F7, 0xF8F7,
- 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, 0xFFF7, 0x00F7,
- 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, 0x07F7, 0x08F7,
- 0x09F7, 0x0AF7, 0x0BF7, 0x0CF7, 0x0DF7, 0x0EF7, 0x0FF7, 0x10F7,
- 0x11F7, 0x12F7, 0xEEF8, 0xEFF8, 0xF0F8, 0xF1F8, 0xF2F8, 0xF3F8,
- 0xF4F8, 0xF5F8, 0xF6F8, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8,
- 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8,
- 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0x0AF8, 0x0BF8,
- 0x0CF8, 0x0DF8, 0x0EF8, 0x0FF8, 0x10F8, 0x11F8, 0x12F8, 0xEEF9,
- 0xEFF9, 0xF0F9, 0xF1F9, 0xF2F9, 0xF3F9, 0xF4F9, 0xF5F9, 0xF6F9,
- 0xF7F9, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9,
- 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9,
- 0x07F9, 0x08F9, 0x09F9, 0x0AF9, 0x0BF9, 0x0CF9, 0x0DF9, 0x0EF9,
- 0x0FF9, 0x10F9, 0x11F9, 0x12F9, 0xEEFA, 0xEFFA, 0xF0FA, 0xF1FA,
- 0xF2FA, 0xF3FA, 0xF4FA, 0xF5FA, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA,
- 0x0AFA, 0x0BFA, 0x0CFA, 0x0DFA, 0x0EFA, 0x0FFA, 0x10FA, 0x11FA,
- 0x12FA, 0xEEFB, 0xEFFB, 0xF0FB, 0xF1FB, 0xF2FB, 0xF3FB, 0xF4FB,
- 0xF5FB, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB,
- 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB,
- 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, 0x0BFB, 0x0CFB,
- 0x0DFB, 0x0EFB, 0x0FFB, 0x10FB, 0x11FB, 0x12FB, 0xEEFC, 0xEFFC,
- 0xF0FC, 0xF1FC, 0xF2FC, 0xF3FC, 0xF4FC, 0xF5FC, 0xF6FC, 0xF7FC,
- 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC,
- 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC,
- 0x08FC, 0x09FC, 0x0AFC, 0x0BFC, 0x0CFC, 0x0DFC, 0x0EFC, 0x0FFC,
- 0x10FC, 0x11FC, 0x12FC, 0xEEFD, 0xEFFD, 0xF0FD, 0xF1FD, 0xF2FD,
- 0xF3FD, 0xF4FD, 0xF5FD, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD,
- 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD,
- 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD,
- 0x0BFD, 0x0CFD, 0x0DFD, 0x0EFD, 0x0FFD, 0x10FD, 0x11FD, 0x12FD,
- 0xEEFE, 0xEFFE, 0xF0FE, 0xF1FE, 0xF2FE, 0xF3FE, 0xF4FE, 0xF5FE,
- 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0x0BFE, 0x0CFE, 0x0DFE,
- 0x0EFE, 0x0FFE, 0x10FE, 0x11FE, 0x12FE, 0xEEFF, 0xEFFF, 0xF0FF,
- 0xF1FF, 0xF2FF, 0xF3FF, 0xF4FF, 0xF5FF, 0xF6FF, 0xF7FF, 0xF8FF,
- 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF,
- 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF,
- 0x09FF, 0x0AFF, 0x0BFF, 0x0CFF, 0x0DFF, 0x0EFF, 0x0FFF, 0x10FF,
- 0x11FF, 0x12FF, 0xEE00, 0xEF00, 0xF000, 0xF100, 0xF200, 0xF300,
- 0xF400, 0xF500, 0xF600, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00,
- 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300,
- 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0x0A00, 0x0B00,
- 0x0C00, 0x0D00, 0x0E00, 0x0F00, 0x1000, 0x1100, 0x1200, 0xEE01,
- 0xEF01, 0xF001, 0xF101, 0xF201, 0xF301, 0xF401, 0xF501, 0xF601,
- 0xF701, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01,
- 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601,
- 0x0701, 0x0801, 0x0901, 0x0A01, 0x0B01, 0x0C01, 0x0D01, 0x0E01,
- 0x0F01, 0x1001, 0x1101, 0x1201, 0xEE02, 0xEF02, 0xF002, 0xF102,
- 0xF202, 0xF302, 0xF402, 0xF502, 0xF602, 0xF702, 0xF802, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902,
- 0x0A02, 0x0B02, 0x0C02, 0x0D02, 0x0E02, 0x0F02, 0x1002, 0x1102,
- 0x1202, 0xEE03, 0xEF03, 0xF003, 0xF103, 0xF203, 0xF303, 0xF403,
- 0xF503, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03,
- 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403,
- 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, 0x0B03, 0x0C03,
- 0x0D03, 0x0E03, 0x0F03, 0x1003, 0x1103, 0x1203, 0xEE04, 0xEF04,
- 0xF004, 0xF104, 0xF204, 0xF304, 0xF404, 0xF504, 0xF604, 0xF704,
- 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04,
- 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704,
- 0x0804, 0x0904, 0x0A04, 0x0B04, 0x0C04, 0x0D04, 0x0E04, 0x0F04,
- 0x1004, 0x1104, 0x1204, 0xEE05, 0xEF05, 0xF005, 0xF105, 0xF205,
- 0xF305, 0xF405, 0xF505, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05,
- 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205,
- 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05,
- 0x0B05, 0x0C05, 0x0D05, 0x0E05, 0x0F05, 0x1005, 0x1105, 0x1205,
- 0xEE06, 0xEF06, 0xF006, 0xF106, 0xF206, 0xF306, 0xF406, 0xF506,
- 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0x0B06, 0x0C06, 0x0D06,
- 0x0E06, 0x0F06, 0x1006, 0x1106, 0x1206, 0xEE07, 0xEF07, 0xF007,
- 0xF107, 0xF207, 0xF307, 0xF407, 0xF507, 0xF607, 0xF707, 0xF807,
- 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007,
- 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807,
- 0x0907, 0x0A07, 0x0B07, 0x0C07, 0x0D07, 0x0E07, 0x0F07, 0x1007,
- 0x1107, 0x1207, 0xEE08, 0xEF08, 0xF008, 0xF108, 0xF208, 0xF308,
- 0xF408, 0xF508, 0xF608, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08,
- 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308,
- 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0x0A08, 0x0B08,
- 0x0C08, 0x0D08, 0x0E08, 0x0F08, 0x1008, 0x1108, 0x1208, 0xEE09,
- 0xEF09, 0xF009, 0xF109, 0xF209, 0xF309, 0xF409, 0xF509, 0xF609,
- 0xF709, 0xF809, 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09,
- 0xFF09, 0x0009, 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609,
- 0x0709, 0x0809, 0x0909, 0x0A09, 0x0B09, 0x0C09, 0x0D09, 0x0E09,
- 0x0F09, 0x1009, 0x1109, 0x1209, 0xEE0A, 0xEF0A, 0xF00A, 0xF10A,
- 0xF20A, 0xF30A, 0xF40A, 0xF50A, 0xF60A, 0xF70A, 0xF80A, 0xF90A,
- 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A,
- 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A,
- 0x0A0A, 0x0B0A, 0x0C0A, 0x0D0A, 0x0E0A, 0x0F0A, 0x100A, 0x110A,
- 0x120A, 0xEE0B, 0xEF0B, 0xF00B, 0xF10B, 0xF20B, 0xF30B, 0xF40B,
- 0xF50B, 0xF60B, 0xF70B, 0xF80B, 0xF90B, 0xFA0B, 0xFB0B, 0xFC0B,
- 0xFD0B, 0xFE0B, 0xFF0B, 0x000B, 0x010B, 0x020B, 0x030B, 0x040B,
- 0x050B, 0x060B, 0x070B, 0x080B, 0x090B, 0x0A0B, 0x0B0B, 0x0C0B,
- 0x0D0B, 0x0E0B, 0x0F0B, 0x100B, 0x110B, 0x120B, 0xEE0C, 0xEF0C,
- 0xF00C, 0xF10C, 0xF20C, 0xF30C, 0xF40C, 0xF50C, 0xF60C, 0xF70C,
- 0xF80C, 0xF90C, 0xFA0C, 0xFB0C, 0xFC0C, 0xFD0C, 0xFE0C, 0xFF0C,
- 0x000C, 0x010C, 0x020C, 0x030C, 0x040C, 0x050C, 0x060C, 0x070C,
- 0x080C, 0x090C, 0x0A0C, 0x0B0C, 0x0C0C, 0x0D0C, 0x0E0C, 0x0F0C,
- 0x100C, 0x110C, 0x120C, 0xEE0D, 0xEF0D, 0xF00D, 0xF10D, 0xF20D,
- 0xF30D, 0xF40D, 0xF50D, 0xF60D, 0xF70D, 0xF80D, 0xF90D, 0xFA0D,
- 0xFB0D, 0xFC0D, 0xFD0D, 0xFE0D, 0xFF0D, 0x000D, 0x010D, 0x020D,
- 0x030D, 0x040D, 0x050D, 0x060D, 0x070D, 0x080D, 0x090D, 0x0A0D,
- 0x0B0D, 0x0C0D, 0x0D0D, 0x0E0D, 0x0F0D, 0x100D, 0x110D, 0x120D,
- 0xEE0E, 0xEF0E, 0xF00E, 0xF10E, 0xF20E, 0xF30E, 0xF40E, 0xF50E,
- 0xF60E, 0xF70E, 0xF80E, 0xF90E, 0xFA0E, 0xFB0E, 0xFC0E, 0xFD0E,
- 0xFE0E, 0xFF0E, 0x000E, 0x010E, 0x020E, 0x030E, 0x040E, 0x050E,
- 0x060E, 0x070E, 0x080E, 0x090E, 0x0A0E, 0x0B0E, 0x0C0E, 0x0D0E,
- 0x0E0E, 0x0F0E, 0x100E, 0x110E, 0x120E, 0xEE0F, 0xEF0F, 0xF00F,
- 0xF10F, 0xF20F, 0xF30F, 0xF40F, 0xF50F, 0xF60F, 0xF70F, 0xF80F,
- 0xF90F, 0xFA0F, 0xFB0F, 0xFC0F, 0xFD0F, 0xFE0F, 0xFF0F, 0x000F,
- 0x010F, 0x020F, 0x030F, 0x040F, 0x050F, 0x060F, 0x070F, 0x080F,
- 0x090F, 0x0A0F, 0x0B0F, 0x0C0F, 0x0D0F, 0x0E0F, 0x0F0F, 0x100F,
- 0x110F, 0x120F, 0xEE10, 0xEF10, 0xF010, 0xF110, 0xF210, 0xF310,
- 0xF410, 0xF510, 0xF610, 0xF710, 0xF810, 0xF910, 0xFA10, 0xFB10,
- 0xFC10, 0xFD10, 0xFE10, 0xFF10, 0x0010, 0x0110, 0x0210, 0x0310,
- 0x0410, 0x0510, 0x0610, 0x0710, 0x0810, 0x0910, 0x0A10, 0x0B10,
- 0x0C10, 0x0D10, 0x0E10, 0x0F10, 0x1010, 0x1110, 0x1210, 0xEE11,
- 0xEF11, 0xF011, 0xF111, 0xF211, 0xF311, 0xF411, 0xF511, 0xF611,
- 0xF711, 0xF811, 0xF911, 0xFA11, 0xFB11, 0xFC11, 0xFD11, 0xFE11,
- 0xFF11, 0x0011, 0x0111, 0x0211, 0x0311, 0x0411, 0x0511, 0x0611,
- 0x0711, 0x0811, 0x0911, 0x0A11, 0x0B11, 0x0C11, 0x0D11, 0x0E11,
- 0x0F11, 0x1011, 0x1111, 0x1211, 0xEE12, 0xEF12, 0xF012, 0xF112,
- 0xF212, 0xF312, 0xF412, 0xF512, 0xF612, 0xF712, 0xF812, 0xF912,
- 0xFA12, 0xFB12, 0xFC12, 0xFD12, 0xFE12, 0xFF12, 0x0012, 0x0112,
- 0x0212, 0x0312, 0x0412, 0x0512, 0x0612, 0x0712, 0x0812, 0x0912,
- 0x0A12, 0x0B12, 0x0C12, 0x0D12, 0x0E12, 0x0F12, 0x1012, 0x1112,
- 0x1212, 0x1313,
-];
-const CLV_MVY_3_ESCAPE: u16 = 0x1313;
-
-const CLV_BIASY_3_BITS: &[u8] = &[
- 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14,
- 14, 14, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10,
- 10, 9, 9, 9, 9, 8, 8, 7, 7, 6, 5, 4, 4, 2, 2, 3,
- 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10,
- 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 15,
-];
-const CLV_BIASY_3_CODES: &[u16] = &[
- 0xFFFF, 0xFFFC, 0xFFFA, 0x7FFC, 0x7FF9, 0x7FF6, 0x7FF4, 0x7FF2,
- 0x7FF1, 0x7FEF, 0x7FEC, 0x7FEB, 0x7FE9, 0x3FF3, 0x3FF0, 0x3FEE,
- 0x3FED, 0x3FEA, 0x1FF3, 0x1FF2, 0x1FF0, 0x1FEE, 0x0FF4, 0x0FF3,
- 0x0FF1, 0x07F7, 0x07F5, 0x07F3, 0x07F1, 0x03F7, 0x03F4, 0x03F2,
- 0x03F0, 0x01F6, 0x01F4, 0x01F2, 0x01F0, 0x00F6, 0x00F4, 0x0078,
- 0x0076, 0x0039, 0x001B, 0x000C, 0x000A, 0x0001, 0x0000, 0x0004,
- 0x000B, 0x001A, 0x0038, 0x003A, 0x0077, 0x0079, 0x00F5, 0x00F7,
- 0x01F1, 0x01F3, 0x01F5, 0x01F7, 0x03F1, 0x03F3, 0x03F5, 0x03F6,
- 0x07F0, 0x07F2, 0x07F4, 0x07F6, 0x0FF0, 0x0FF2, 0x0FF5, 0x0FF6,
- 0x1FEF, 0x1FF1, 0x1FF4, 0x3FEB, 0x3FEC, 0x3FEF, 0x3FF1, 0x3FF2,
- 0x7FE8, 0x7FEA, 0x7FED, 0x7FEE, 0x7FF0, 0x7FF3, 0x7FF5, 0x7FF7,
- 0x7FFA, 0x7FFB, 0xFFFB, 0xFFFD, 0xFFFE, 0x7FF8,
-];
-const CLV_BIASY_3_SYMS: &[u16] = &[
- 0xFF48, 0xFF4C, 0xFF50, 0xFF54, 0xFF58, 0xFF5C, 0xFF60, 0xFF64,
- 0xFF68, 0xFF6C, 0xFF70, 0xFF74, 0xFF78, 0xFF7C, 0xFF80, 0xFF84,
- 0xFF88, 0xFF8C, 0xFF90, 0xFF94, 0xFF98, 0xFF9C, 0xFFA0, 0xFFA4,
- 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4,
- 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4,
- 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004,
- 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024,
- 0x0028, 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044,
- 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, 0x0060, 0x0064,
- 0x0068, 0x006C, 0x0070, 0x0074, 0x0078, 0x007C, 0x0080, 0x0084,
- 0x0088, 0x008C, 0x0090, 0x0094, 0x0098, 0x009C, 0x00A0, 0x00A4,
- 0x00A8, 0x00AC, 0x00B0, 0x00B4, 0x00B8, 0x0100,
-];
-
-const CLV_FLAGSU_0_BITS: &[u8] = &[
- 1, 4, 4, 4, 5, 5, 9, 7, 5, 9, 4, 7, 4, 8, 7, 4,
-];
-const CLV_FLAGSU_0_CODES: &[u16] = &[
- 0x0000, 0x000B, 0x000D, 0x0009, 0x001D, 0x001C, 0x01FF, 0x007D,
- 0x001E, 0x01FE, 0x000C, 0x007C, 0x000A, 0x00FE, 0x007E, 0x0008,
-];
-
-const CLV_MVU_1_BITS: &[u8] = &[
- 16, 14, 14, 14, 13, 12, 12, 10, 12, 12, 13, 14, 14, 14, 16, 15,
- 13, 13, 12, 12, 11, 11, 7, 11, 11, 12, 12, 13, 13, 15, 16, 16,
- 16, 13, 12, 10, 10, 6, 10, 10, 12, 13, 16, 16, 16, 14, 14, 11,
- 11, 11, 11, 9, 7, 9, 11, 11, 11, 11, 14, 14, 15, 13, 13, 12,
- 9, 8, 8, 4, 8, 8, 9, 12, 13, 13, 15, 14, 14, 11, 11, 10,
- 9, 8, 4, 8, 9, 10, 11, 12, 14, 14, 12, 12, 11, 10, 10, 8,
- 6, 3, 6, 8, 10, 10, 11, 12, 12, 11, 10, 9, 6, 6, 6, 5,
- 4, 5, 6, 6, 6, 9, 10, 11, 12, 12, 11, 10, 10, 8, 6, 3,
- 6, 7, 10, 10, 11, 12, 12, 14, 14, 11, 11, 10, 9, 8, 4, 8,
- 9, 10, 11, 11, 14, 14, 15, 13, 13, 12, 9, 8, 8, 4, 8, 8,
- 9, 12, 13, 13, 15, 14, 14, 11, 11, 11, 11, 9, 7, 9, 11, 11,
- 11, 11, 14, 14, 16, 16, 16, 13, 12, 10, 10, 6, 10, 10, 12, 13,
- 16, 16, 16, 15, 13, 13, 12, 12, 11, 11, 7, 11, 11, 12, 12, 13,
- 13, 15, 16, 14, 14, 14, 13, 12, 12, 10, 12, 12, 13, 14, 14, 14,
- 16, 7,
-];
-const CLV_MVU_1_CODES: &[u16] = &[
- 0xFFFC, 0x3FED, 0x3FE5, 0x3FE3, 0x1FD9, 0x0FD9, 0x0FD6, 0x03CE,
- 0x0FD3, 0x0FD8, 0x1FD6, 0x3FE0, 0x3FE8, 0x3FEC, 0xFFFE, 0x7FF3,
- 0x1FE7, 0x1FDA, 0x0FCF, 0x0FCC, 0x07DD, 0x07CC, 0x006B, 0x07CD,
- 0x07DE, 0x0FCE, 0x0FD2, 0x1FDD, 0x1FEC, 0x7FF0, 0xFFF6, 0xFFFA,
- 0xFFF2, 0x1FDE, 0x0FDB, 0x03D8, 0x03CA, 0x002E, 0x03CB, 0x03D9,
- 0x0FDC, 0x1FDF, 0xFFF3, 0xFFF9, 0xFFF5, 0x3FF3, 0x3FDD, 0x07DA,
- 0x07D2, 0x07CA, 0x07C2, 0x01DE, 0x0069, 0x01DF, 0x07C3, 0x07CB,
- 0x07D3, 0x07DB, 0x3FDF, 0x3FF6, 0x7FF7, 0x1FED, 0x1FE5, 0x0FDF,
- 0x01D8, 0x00E3, 0x00DF, 0x0007, 0x00E0, 0x00E4, 0x01D9, 0x0FE0,
- 0x1FE3, 0x1FE9, 0x7FF4, 0x3FF5, 0x3FE7, 0x07E4, 0x07C6, 0x03D2,
- 0x01E2, 0x00E9, 0x0006, 0x00EA, 0x01E3, 0x03D3, 0x07C7, 0x0FCA,
- 0x3FE9, 0x3FF0, 0x0FE8, 0x0FE5, 0x07D5, 0x03DD, 0x03D5, 0x00DC,
- 0x002B, 0x0001, 0x002C, 0x00DD, 0x03D6, 0x03DE, 0x07D6, 0x0FE4,
- 0x0FE9, 0x07E0, 0x03C8, 0x01D6, 0x0032, 0x0030, 0x0028, 0x0012,
- 0x0004, 0x0013, 0x0029, 0x0031, 0x0033, 0x01D7, 0x03C9, 0x07E1,
- 0x0FEA, 0x0FE6, 0x07D7, 0x03DF, 0x03D7, 0x00DE, 0x002D, 0x0000,
- 0x002A, 0x006D, 0x03D4, 0x03DC, 0x07D4, 0x0FE3, 0x0FE7, 0x3FF1,
- 0x3FE4, 0x07E2, 0x07C4, 0x03D0, 0x01E0, 0x00E7, 0x0005, 0x00E8,
- 0x01E1, 0x03D1, 0x07C5, 0x07E3, 0x3FEA, 0x3FF7, 0x7FF6, 0x1FE6,
- 0x1FE4, 0x0FE1, 0x01DA, 0x00E5, 0x00E1, 0x0008, 0x00E2, 0x00E6,
- 0x01DB, 0x0FE2, 0x1FE2, 0x1FEB, 0x7FF5, 0x3FF4, 0x3FDC, 0x07D9,
- 0x07D0, 0x07C8, 0x07C0, 0x01DC, 0x0068, 0x01DD, 0x07C1, 0x07C9,
- 0x07D1, 0x07D8, 0x3FDE, 0x3FF2, 0xFFFB, 0xFFF4, 0xFFF0, 0x1FE1,
- 0x0FDD, 0x03DA, 0x03CC, 0x002F, 0x03CD, 0x03DB, 0x0FDE, 0x1FE0,
- 0xFFF1, 0xFFF7, 0xFFF8, 0x7FF2, 0x1FEA, 0x1FDC, 0x0FD1, 0x0FCD,
- 0x07DC, 0x07CF, 0x006C, 0x07CE, 0x07DF, 0x0FCB, 0x0FD0, 0x1FDB,
- 0x1FE8, 0x7FF1, 0xFFFD, 0x3FEE, 0x3FEB, 0x3FE1, 0x1FD7, 0x0FD7,
- 0x0FD5, 0x03CF, 0x0FD4, 0x0FDA, 0x1FD8, 0x3FE2, 0x3FE6, 0x3FEF,
- 0xFFFF, 0x006A,
-];
-const CLV_MVU_1_SYMS: &[u16] = &[
- 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9,
- 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0xF9FB, 0xFAFB,
- 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB,
- 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0xF9FC, 0xFAFC, 0xFBFC,
- 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC,
- 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD,
- 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD,
- 0x05FD, 0x06FD, 0x07FD, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF,
- 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF,
- 0x07FF, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00,
- 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
- 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001,
- 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0xF903, 0xFA03,
- 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203,
- 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0xF904, 0xFA04, 0xFB04,
- 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304,
- 0x0404, 0x0504, 0x0604, 0x0704, 0xF905, 0xFA05, 0xFB05, 0xFC05,
- 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405,
- 0x0505, 0x0605, 0x0705, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07,
- 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607,
- 0x0707, 0x0808,
-];
-const CLV_MVU_1_ESCAPE: u16 = 0x0808;
-
-const CLV_BIASU_1_BITS: &[u8] = &[
- 16, 15, 14, 13, 13, 13, 12, 12, 12, 12, 11, 10, 10, 9, 9, 8,
- 7, 6, 5, 2, 1, 3, 5, 7, 7, 8, 9, 9, 10, 10, 11, 12,
- 12, 12, 12, 13, 13, 13, 14, 15, 15, 16,
-];
-const CLV_BIASU_1_CODES: &[u16] = &[
- 0xFFFE, 0x7FFC, 0x3FFC, 0x1FFC, 0x1FFA, 0x1FF9, 0x0FFA, 0x0FF7,
- 0x0FF8, 0x0FF5, 0x07F8, 0x03FA, 0x03F8, 0x01FA, 0x01F9, 0x00FA,
- 0x007B, 0x003C, 0x001C, 0x0002, 0x0000, 0x0006, 0x001D, 0x007A,
- 0x007C, 0x00FB, 0x01F8, 0x01FB, 0x03F9, 0x03FB, 0x07F9, 0x0FF4,
- 0x0FF6, 0x0FF9, 0x0FFB, 0x1FF8, 0x1FFB, 0x1FFD, 0x3FFD, 0x7FFD,
- 0x7FFE, 0xFFFF,
-];
-const CLV_BIASU_1_SYMS: &[u16] = &[
- 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC,
- 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC,
- 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, 0x000C,
- 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, 0x002C,
- 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C,
- 0x0050, 0x0100,
-];
-
-const CLV_FLAGSU_1_BITS: &[u8] = &[
- 1, 4, 4, 4, 4, 4, 8, 6, 4, 8, 5, 8, 4, 10, 9, 10,
-];
-const CLV_FLAGSU_1_CODES: &[u16] = &[
- 0x0000, 0x000C, 0x0008, 0x000A, 0x000B, 0x000E, 0x00FD, 0x003E,
- 0x000D, 0x00FC, 0x001E, 0x00FE, 0x0009, 0x03FE, 0x01FE, 0x03FF,
-];
-
-const CLV_MVU_2_BITS: &[u8] = &[
- 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 15, 15,
- 15, 15, 16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13,
- 13, 14, 14, 14, 14, 14, 15, 15, 15, 16, 16, 15, 15, 14, 14, 14,
- 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 16, 16,
- 15, 15, 14, 13, 13, 13, 13, 13, 12, 12, 12, 13, 13, 13, 13, 13,
- 14, 15, 15, 16, 14, 14, 14, 14, 13, 12, 12, 12, 12, 11, 10, 11,
- 12, 12, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14, 13, 12, 12, 12,
- 12, 11, 10, 9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 14,
- 13, 13, 12, 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13,
- 13, 14, 15, 14, 14, 14, 13, 12, 12, 11, 11, 10, 9, 7, 9, 10,
- 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 13, 12, 12, 11, 11, 10,
- 9, 8, 7, 8, 9, 10, 11, 11, 12, 12, 13, 14, 14, 14, 13, 13,
- 12, 11, 9, 9, 8, 7, 6, 5, 6, 7, 8, 9, 9, 11, 12, 13,
- 13, 14, 14, 13, 13, 13, 11, 11, 10, 8, 7, 4, 1, 4, 7, 8,
- 10, 11, 11, 13, 13, 13, 14, 14, 13, 13, 12, 11, 9, 9, 8, 7,
- 6, 5, 6, 7, 8, 9, 9, 11, 12, 13, 13, 14, 14, 14, 13, 12,
- 11, 11, 11, 9, 9, 8, 7, 8, 9, 10, 11, 11, 12, 12, 13, 14,
- 14, 14, 14, 14, 13, 12, 12, 11, 11, 10, 9, 7, 9, 10, 11, 11,
- 12, 12, 13, 14, 14, 14, 15, 14, 13, 13, 12, 12, 12, 12, 11, 10,
- 9, 10, 11, 12, 12, 12, 12, 13, 13, 14, 15, 14, 14, 14, 13, 12,
- 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14,
- 14, 14, 14, 14, 13, 12, 12, 12, 12, 11, 10, 11, 12, 12, 12, 12,
- 13, 14, 14, 14, 14, 16, 15, 15, 14, 13, 13, 13, 13, 13, 12, 12,
- 12, 13, 13, 13, 13, 13, 14, 15, 15, 16, 16, 15, 15, 14, 14, 14,
- 14, 14, 14, 13, 12, 13, 14, 14, 14, 14, 14, 14, 15, 15, 16, 16,
- 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14,
- 15, 15, 15, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14,
- 14, 14, 15, 15, 15, 15, 16, 16, 16, 6,
-];
-const CLV_MVU_2_CODES: &[u16] = &[
- 0xFFF2, 0xFFEF, 0xFFEA, 0x7FEC, 0x7FD5, 0x7FC5, 0x7FCF, 0x3FD3,
- 0x3FC9, 0x3FB4, 0x3F72, 0x3FAE, 0x3FDC, 0x3FE1, 0x7FC4, 0x7FC8,
- 0x7FD7, 0x7FF0, 0xFFE9, 0xFFEC, 0xFFF8, 0xFFF4, 0x7FF3, 0x7FDE,
- 0x7FD3, 0x3FC0, 0x3F99, 0x3FA8, 0x3FAC, 0x3F8E, 0x1FA8, 0x1F79,
- 0x1FA2, 0x3F89, 0x3F93, 0x3F95, 0x3F9C, 0x3FB8, 0x7FD2, 0x7FE6,
- 0x7FDA, 0xFFF7, 0xFFFE, 0x7FED, 0x7FE2, 0x3FD5, 0x3FD7, 0x3FB3,
- 0x3FA2, 0x3F80, 0x3F7A, 0x1F88, 0x1F70, 0x1F8A, 0x3F83, 0x3F84,
- 0x3FAA, 0x3FC4, 0x3FDA, 0x3FDF, 0x7FDB, 0x7FE3, 0xFFF1, 0xFFFB,
- 0x7FE1, 0x7FC7, 0x3FB0, 0x1FAA, 0x1FAB, 0x1FA3, 0x1F8E, 0x1F81,
- 0x0FA7, 0x0F7F, 0x0FA8, 0x1F82, 0x1F8F, 0x1FA4, 0x1FAC, 0x1FAD,
- 0x3FB5, 0x7FC6, 0x7FDD, 0xFFF3, 0x3FDD, 0x3FBE, 0x3FB9, 0x3F7C,
- 0x1F77, 0x0FB5, 0x0F9D, 0x0F99, 0x0F90, 0x0794, 0x03BE, 0x0795,
- 0x0F92, 0x0F9A, 0x0F9E, 0x0FB6, 0x1F78, 0x3F78, 0x3FB2, 0x3FBF,
- 0x3FD2, 0x3FA7, 0x3F8C, 0x3F75, 0x1F9E, 0x0F93, 0x0F94, 0x0F7B,
- 0x0F73, 0x07B4, 0x03BB, 0x01D9, 0x03BC, 0x07B5, 0x0F74, 0x0F7C,
- 0x0F95, 0x0F96, 0x1FA0, 0x3F76, 0x3F8F, 0x3FA5, 0x7FE5, 0x3FC7,
- 0x1F95, 0x1F71, 0x0FAB, 0x0FAC, 0x0F9F, 0x0F7D, 0x0796, 0x03BF,
- 0x00DE, 0x03C0, 0x0797, 0x0F7E, 0x0FA0, 0x0FAD, 0x0FAE, 0x1F72,
- 0x1F97, 0x3FD1, 0x7FD8, 0x3FA9, 0x3FA0, 0x3F6D, 0x1F99, 0x0F87,
- 0x0F77, 0x07A8, 0x079C, 0x03C5, 0x01CA, 0x0067, 0x01CB, 0x03C6,
- 0x079D, 0x07A9, 0x0F78, 0x0F8A, 0x1F9F, 0x3F6E, 0x3F98, 0x3F9A,
- 0x3FCA, 0x3F70, 0x1FAF, 0x0F8D, 0x0F6F, 0x07AC, 0x07A0, 0x03B7,
- 0x01CE, 0x00DA, 0x0063, 0x00DB, 0x01CF, 0x03B8, 0x07A1, 0x07AD,
- 0x0F70, 0x0F91, 0x1FB2, 0x3F73, 0x3FD6, 0x3F7D, 0x1F91, 0x1F85,
- 0x0FA3, 0x07A2, 0x01D4, 0x01D0, 0x00E0, 0x0068, 0x002C, 0x0014,
- 0x002D, 0x0069, 0x00E1, 0x01D1, 0x01D5, 0x07A3, 0x0FA4, 0x1F89,
- 0x1F92, 0x3F81, 0x3FA6, 0x1F7B, 0x1F7C, 0x1F7D, 0x07B0, 0x07AE,
- 0x03C7, 0x00DC, 0x0064, 0x0008, 0x0000, 0x0009, 0x0065, 0x00DD,
- 0x03C8, 0x07AF, 0x07B1, 0x1F7E, 0x1F7F, 0x1F80, 0x3F9E, 0x3F85,
- 0x1F93, 0x1F8B, 0x0FA5, 0x07A4, 0x01D6, 0x01D2, 0x00E2, 0x006A,
- 0x002E, 0x0015, 0x002F, 0x006B, 0x00E3, 0x01D3, 0x01D7, 0x07A5,
- 0x0FA6, 0x1F8C, 0x1F94, 0x3F87, 0x3FCE, 0x3F77, 0x1FB4, 0x0F83,
- 0x07B6, 0x07AA, 0x079E, 0x01DA, 0x01CC, 0x00D8, 0x0062, 0x00D9,
- 0x01CD, 0x03B6, 0x079F, 0x07AB, 0x0F6E, 0x0F84, 0x1FA9, 0x3F6A,
- 0x3FCD, 0x3F90, 0x3F92, 0x3F6B, 0x1F96, 0x0F85, 0x0F75, 0x07A6,
- 0x079A, 0x03C3, 0x01C8, 0x0066, 0x01C9, 0x03C4, 0x079B, 0x07A7,
- 0x0F76, 0x0F86, 0x1F9D, 0x3F6C, 0x3F96, 0x3F97, 0x7FE9, 0x3FD8,
- 0x1F98, 0x1F73, 0x0FAF, 0x0FB0, 0x0FA1, 0x0F80, 0x0798, 0x03C1,
- 0x01D8, 0x03C2, 0x0799, 0x0F81, 0x0FA2, 0x0FB1, 0x0FB2, 0x1F74,
- 0x1F9A, 0x3FE0, 0x7FEE, 0x3F94, 0x3F8B, 0x3F6F, 0x1F9B, 0x0F88,
- 0x0F89, 0x0F79, 0x0F71, 0x07B2, 0x03B9, 0x00DF, 0x03BA, 0x07B3,
- 0x0F72, 0x0F7A, 0x0F8B, 0x0F8C, 0x1F9C, 0x3F71, 0x3F8A, 0x3F9B,
- 0x3FC8, 0x3FBD, 0x3FC5, 0x3F79, 0x1F75, 0x0FB3, 0x0F9C, 0x0F97,
- 0x0F8E, 0x0792, 0x03BD, 0x0793, 0x0F8F, 0x0F98, 0x0F9B, 0x0FB4,
- 0x1F76, 0x3F82, 0x3FC3, 0x3FBA, 0x3FC6, 0xFFFD, 0x7FDF, 0x7FCC,
- 0x3FBB, 0x1FB0, 0x1FAE, 0x1FA1, 0x1F90, 0x1F83, 0x0FAA, 0x0F82,
- 0x0FA9, 0x1F84, 0x1F8D, 0x1FA5, 0x1FB1, 0x1FB3, 0x3FC2, 0x7FCA,
- 0x7FE8, 0xFFF5, 0xFFFF, 0x7FDC, 0x7FD9, 0x3FCC, 0x3FD9, 0x3FB7,
- 0x3F9F, 0x3F7E, 0x3F86, 0x1F86, 0x0FB7, 0x1F87, 0x3F7B, 0x3F7F,
- 0x3FA1, 0x3FBC, 0x3FCB, 0x3FD4, 0x7FF1, 0x7FF2, 0xFFFA, 0xFFFC,
- 0x7FE4, 0x7FE7, 0x7FD4, 0x3FAF, 0x3FA3, 0x3F91, 0x3F9D, 0x3F88,
- 0x1FA6, 0x1F7A, 0x1FA7, 0x3F8D, 0x3FAB, 0x3FAD, 0x3FA4, 0x3FB6,
- 0x7FD0, 0x7FE0, 0x7FEB, 0xFFF0, 0xFFF9, 0xFFEB, 0xFFED, 0x7FEA,
- 0x7FD6, 0x7FC9, 0x7FCB, 0x3FD0, 0x3FDE, 0x3FB1, 0x3F74, 0x3FC1,
- 0x3FCF, 0x3FDB, 0x7FCD, 0x7FCE, 0x7FD1, 0x7FEF, 0xFFE8, 0xFFEE,
- 0xFFF6, 0x0030,
-];
-const CLV_MVU_2_SYMS: &[u16] = &[
- 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6,
- 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6,
- 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0xF6F7, 0xF7F7, 0xF8F7,
- 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, 0xFFF7, 0x00F7,
- 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, 0x07F7, 0x08F7,
- 0x09F7, 0x0AF7, 0xF6F8, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8,
- 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8,
- 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0x0AF8, 0xF6F9,
- 0xF7F9, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9,
- 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9,
- 0x07F9, 0x08F9, 0x09F9, 0x0AF9, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA,
- 0x0AFA, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB,
- 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB,
- 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, 0xF6FC, 0xF7FC,
- 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC,
- 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC,
- 0x08FC, 0x09FC, 0x0AFC, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD,
- 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD,
- 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD,
- 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0xF6FF, 0xF7FF, 0xF8FF,
- 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF,
- 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF,
- 0x09FF, 0x0AFF, 0xF600, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00,
- 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300,
- 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0x0A00, 0xF601,
- 0xF701, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01,
- 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601,
- 0x0701, 0x0801, 0x0901, 0x0A01, 0xF602, 0xF702, 0xF802, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902,
- 0x0A02, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03,
- 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403,
- 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, 0xF604, 0xF704,
- 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04,
- 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704,
- 0x0804, 0x0904, 0x0A04, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05,
- 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205,
- 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05,
- 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0xF607, 0xF707, 0xF807,
- 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007,
- 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807,
- 0x0907, 0x0A07, 0xF608, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08,
- 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308,
- 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0x0A08, 0xF609,
- 0xF709, 0xF809, 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09,
- 0xFF09, 0x0009, 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609,
- 0x0709, 0x0809, 0x0909, 0x0A09, 0xF60A, 0xF70A, 0xF80A, 0xF90A,
- 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A,
- 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A,
- 0x0A0A, 0x0B0B,
-];
-const CLV_MVU_2_ESCAPE: u16 = 0x0B0B;
-
-const CLV_BIASU_2_BITS: &[u8] = &[
- 16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 12, 12, 11, 11, 10,
- 10, 9, 9, 8, 8, 7, 6, 5, 4, 3, 1, 3, 4, 6, 6, 7,
- 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 14, 14, 15, 15,
- 15, 16, 16, 16, 16, 14,
-];
-const CLV_BIASU_2_CODES: &[u16] = &[
- 0xFFFC, 0xFFF8, 0xFFFA, 0xFFFD, 0x7FF8, 0x7FFA, 0x7FF7, 0x3FF6,
- 0x3FF7, 0x3FF4, 0x1FF9, 0x0FFB, 0x0FF9, 0x07FB, 0x07F9, 0x03FA,
- 0x03F8, 0x01FA, 0x01F9, 0x00FB, 0x00F9, 0x007B, 0x003B, 0x001C,
- 0x000C, 0x0004, 0x0000, 0x0005, 0x000D, 0x003A, 0x003C, 0x007A,
- 0x00F8, 0x00FA, 0x01F8, 0x01FB, 0x03F9, 0x03FB, 0x07F8, 0x07FA,
- 0x0FF8, 0x0FFA, 0x1FF8, 0x3FF5, 0x3FF8, 0x3FF9, 0x7FFB, 0x7FF9,
- 0x7FF6, 0xFFF9, 0xFFFF, 0xFFFE, 0xFFFB, 0x3FFA,
-];
-const CLV_BIASU_2_SYMS: &[u16] = &[
- 0xFF98, 0xFF9C, 0xFFA0, 0xFFA4, 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4,
- 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4,
- 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4,
- 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014,
- 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, 0x002C, 0x0030, 0x0034,
- 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C, 0x0050, 0x0054,
- 0x0058, 0x005C, 0x0060, 0x0064, 0x0068, 0x0100,
-];
-
-const CLV_FLAGSV_0_BITS: &[u8] = &[
- 1, 4, 5, 4, 5, 5, 8, 10, 5, 9, 5, 6, 4, 10, 7, 3,
-];
-const CLV_FLAGSV_0_CODES: &[u16] = &[
- 0x0000, 0x000A, 0x001B, 0x000C, 0x001E, 0x001C, 0x00FE, 0x03FE,
- 0x001D, 0x01FE, 0x001A, 0x003E, 0x000B, 0x03FF, 0x007E, 0x0004,
-];
-
-const CLV_MVV_1_BITS: &[u8] = &[
- 16, 15, 13, 13, 13, 12, 10, 10, 10, 12, 13, 13, 13, 15, 16, 16,
- 15, 14, 13, 12, 11, 10, 9, 10, 11, 12, 13, 14, 15, 16, 15, 14,
- 13, 13, 11, 10, 10, 5, 10, 10, 11, 13, 13, 14, 15, 12, 12, 12,
- 11, 10, 10, 9, 5, 9, 10, 10, 11, 12, 12, 12, 14, 12, 12, 12,
- 11, 9, 8, 5, 8, 9, 11, 12, 12, 12, 14, 14, 11, 11, 9, 9,
- 9, 7, 5, 7, 9, 9, 9, 11, 11, 14, 13, 12, 11, 10, 10, 8,
- 6, 3, 6, 8, 10, 10, 11, 12, 13, 11, 10, 9, 7, 6, 6, 4,
- 4, 4, 6, 7, 7, 10, 10, 11, 13, 12, 11, 10, 10, 8, 6, 3,
- 6, 8, 10, 10, 11, 12, 13, 14, 11, 11, 9, 9, 9, 7, 5, 7,
- 9, 9, 9, 11, 11, 14, 14, 12, 12, 12, 11, 9, 8, 5, 8, 9,
- 11, 12, 12, 12, 14, 12, 12, 12, 11, 10, 10, 9, 5, 9, 10, 10,
- 11, 12, 12, 12, 15, 14, 13, 13, 11, 10, 10, 5, 10, 10, 11, 13,
- 13, 14, 15, 16, 15, 14, 13, 12, 11, 10, 9, 10, 11, 12, 13, 14,
- 15, 16, 16, 15, 13, 13, 13, 12, 10, 10, 10, 12, 13, 13, 13, 15,
- 16, 7,
-];
-const CLV_MVV_1_CODES: &[u16] = &[
- 0xFFFD, 0x7FF8, 0x1FF2, 0x1FDC, 0x1FDB, 0x0FD2, 0x03D6, 0x03BF,
- 0x03D3, 0x0FD0, 0x1FDA, 0x1FDE, 0x1FF0, 0x7FF9, 0xFFFE, 0xFFFA,
- 0x7FFB, 0x3FF3, 0x1FE9, 0x0FD6, 0x07CB, 0x03E1, 0x01C8, 0x03E2,
- 0x07CC, 0x0FD9, 0x1FE8, 0x3FF6, 0x7FFA, 0xFFF9, 0x7FF1, 0x3FEE,
- 0x1FE4, 0x1FE0, 0x07D4, 0x03DB, 0x03CB, 0x0014, 0x03CC, 0x03DC,
- 0x07D6, 0x1FE3, 0x1FE7, 0x3FEC, 0x7FF3, 0x0FEA, 0x0FE0, 0x0FDE,
- 0x07DE, 0x03C9, 0x03C3, 0x01DC, 0x0013, 0x01DD, 0x03C4, 0x03CA,
- 0x07DF, 0x0FDF, 0x0FE3, 0x0FEB, 0x3FF1, 0x0FE7, 0x0FCF, 0x0FC8,
- 0x07D8, 0x01D2, 0x00E0, 0x0010, 0x00E1, 0x01D4, 0x07D9, 0x0FC9,
- 0x0FCC, 0x0FE6, 0x3FF5, 0x3FEA, 0x07E2, 0x07D2, 0x01D7, 0x01D0,
- 0x01CC, 0x006A, 0x000F, 0x006B, 0x01CD, 0x01D1, 0x01D9, 0x07D3,
- 0x07E3, 0x3FEB, 0x1FEE, 0x0FD5, 0x07C7, 0x03D8, 0x03D0, 0x00DD,
- 0x002D, 0x0001, 0x002E, 0x00DE, 0x03D1, 0x03D9, 0x07C8, 0x0FD8,
- 0x1FEF, 0x07CE, 0x03C5, 0x01DE, 0x006C, 0x0032, 0x0030, 0x0005,
- 0x0004, 0x0006, 0x0031, 0x0066, 0x006D, 0x03BE, 0x03C6, 0x07CF,
- 0x1FEC, 0x0FDA, 0x07C9, 0x03DA, 0x03D2, 0x00DF, 0x002F, 0x0000,
- 0x002C, 0x00DC, 0x03CF, 0x03D7, 0x07C6, 0x0FD4, 0x1FED, 0x3FE9,
- 0x07E0, 0x07D0, 0x01D3, 0x01CE, 0x01CA, 0x0068, 0x000E, 0x0069,
- 0x01CB, 0x01CF, 0x01D5, 0x07D1, 0x07E1, 0x3FE8, 0x3FF4, 0x0FE4,
- 0x0FCD, 0x0FCB, 0x07DA, 0x01D6, 0x00E2, 0x0011, 0x00E3, 0x01D8,
- 0x07DB, 0x0FCA, 0x0FCE, 0x0FE5, 0x3FF7, 0x0FE8, 0x0FE1, 0x0FDD,
- 0x07DD, 0x03C7, 0x03C1, 0x01DA, 0x0012, 0x01DB, 0x03C2, 0x03C8,
- 0x07DC, 0x0FDC, 0x0FE2, 0x0FE9, 0x7FF0, 0x3FEF, 0x1FE5, 0x1FE1,
- 0x07D7, 0x03DD, 0x03CD, 0x0015, 0x03CE, 0x03DE, 0x07D5, 0x1FE2,
- 0x1FE6, 0x3FED, 0x7FF2, 0xFFF8, 0x7FF4, 0x3FF2, 0x1FEB, 0x0FD7,
- 0x07CD, 0x03DF, 0x01C9, 0x03E0, 0x07CA, 0x0FDB, 0x1FEA, 0x3FF0,
- 0x7FF5, 0xFFFB, 0xFFFC, 0x7FF6, 0x1FF3, 0x1FDD, 0x1FD9, 0x0FD1,
- 0x03D5, 0x03C0, 0x03D4, 0x0FD3, 0x1FD8, 0x1FDF, 0x1FF1, 0x7FF7,
- 0xFFFF, 0x0067,
-];
-const CLV_MVV_1_SYMS: &[u16] = &[
- 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9,
- 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0xF9FB, 0xFAFB,
- 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB,
- 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0xF9FC, 0xFAFC, 0xFBFC,
- 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC,
- 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD,
- 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD,
- 0x05FD, 0x06FD, 0x07FD, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF,
- 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF,
- 0x07FF, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00,
- 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
- 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001,
- 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0xF903, 0xFA03,
- 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203,
- 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0xF904, 0xFA04, 0xFB04,
- 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304,
- 0x0404, 0x0504, 0x0604, 0x0704, 0xF905, 0xFA05, 0xFB05, 0xFC05,
- 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405,
- 0x0505, 0x0605, 0x0705, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07,
- 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607,
- 0x0707, 0x0808,
-];
-const CLV_MVV_1_ESCAPE: u16 = 0x0808;
-
-const CLV_BIASV_1_BITS: &[u8] = &[
- 16, 15, 14, 14, 14, 13, 13, 13, 12, 12, 11, 11, 10, 10, 9, 8,
- 7, 6, 5, 2, 1, 3, 5, 6, 8, 8, 9, 10, 10, 11, 12, 12,
- 12, 13, 13, 13, 14, 14, 15, 15, 16, 14,
-];
-const CLV_BIASV_1_CODES: &[u16] = &[
- 0xFFFF, 0x7FFD, 0x3FFD, 0x3FFB, 0x3FF9, 0x1FFB, 0x1FF8, 0x1FF6,
- 0x0FFA, 0x0FF8, 0x07FA, 0x07F8, 0x03FA, 0x03F8, 0x01FB, 0x00FB,
- 0x007C, 0x003C, 0x001C, 0x0002, 0x0000, 0x0006, 0x001D, 0x003D,
- 0x00FA, 0x00FC, 0x01FA, 0x03F9, 0x03FB, 0x07F9, 0x0FF6, 0x0FF7,
- 0x0FF9, 0x1FF7, 0x1FF9, 0x1FFA, 0x3FFA, 0x3FFC, 0x7FFC, 0x7FFE,
- 0xFFFE, 0x3FF8,
-];
-const CLV_BIASV_1_SYMS: &[u16] = &[
- 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC,
- 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC,
- 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, 0x000C,
- 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, 0x002C,
- 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C,
- 0x0050, 0x0100,
-];
-
-const CLV_FLAGSV_1_BITS: &[u8] = &[
- 1, 4, 4, 4, 4, 5, 8, 6, 3, 7, 5, 10, 5, 11, 9, 11,
-];
-const CLV_FLAGSV_1_CODES: &[u16] = &[
- 0x0000, 0x000D, 0x000C, 0x000A, 0x000B, 0x001D, 0x00FE, 0x003E,
- 0x0004, 0x007E, 0x001E, 0x03FE, 0x001C, 0x07FE, 0x01FE, 0x07FF,
-];
-
-const CLV_MVV_2_BITS: &[u8] = &[
- 16, 15, 15, 15, 15, 15, 14, 14, 14, 13, 12, 13, 14, 14, 14, 15,
- 15, 15, 15, 15, 16, 16, 16, 16, 15, 15, 14, 14, 14, 13, 13, 12,
- 12, 13, 14, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 14, 14, 14,
- 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 16, 16, 16, 15,
- 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 13, 13, 13, 13, 14,
- 14, 14, 15, 15, 16, 14, 14, 14, 13, 12, 12, 12, 10, 10, 10, 10,
- 10, 12, 12, 12, 13, 14, 14, 14, 16, 14, 14, 14, 13, 13, 12, 12,
- 12, 10, 10, 7, 10, 10, 12, 12, 12, 13, 13, 14, 14, 14, 14, 14,
- 13, 12, 12, 12, 12, 10, 9, 8, 7, 8, 9, 10, 12, 12, 12, 12,
- 13, 14, 14, 14, 14, 13, 12, 12, 12, 12, 10, 9, 8, 7, 8, 9,
- 10, 12, 12, 12, 12, 13, 14, 14, 14, 14, 13, 13, 12, 12, 11, 10,
- 9, 8, 7, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 13, 13,
- 12, 10, 10, 9, 8, 7, 6, 5, 6, 7, 8, 9, 10, 10, 12, 13,
- 13, 14, 13, 13, 13, 13, 11, 10, 9, 8, 7, 5, 1, 5, 7, 8,
- 9, 10, 11, 13, 13, 13, 13, 14, 13, 13, 12, 10, 10, 9, 8, 7,
- 6, 5, 6, 7, 8, 9, 10, 10, 12, 13, 13, 14, 14, 14, 13, 13,
- 12, 12, 11, 9, 9, 8, 7, 8, 9, 9, 11, 12, 12, 13, 13, 14,
- 14, 14, 14, 13, 12, 12, 12, 12, 10, 9, 8, 7, 8, 9, 10, 12,
- 12, 12, 12, 13, 14, 14, 14, 14, 13, 12, 12, 12, 12, 10, 9, 8,
- 7, 8, 9, 10, 12, 12, 12, 12, 13, 14, 14, 14, 14, 14, 13, 13,
- 12, 12, 12, 10, 10, 7, 10, 10, 12, 12, 12, 13, 13, 14, 14, 14,
- 16, 14, 14, 14, 13, 12, 12, 12, 10, 10, 10, 10, 10, 12, 12, 12,
- 13, 14, 14, 14, 16, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12,
- 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 14, 14, 14,
- 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 16, 16, 16, 16,
- 16, 16, 15, 15, 14, 14, 14, 13, 12, 12, 12, 13, 14, 14, 14, 15,
- 15, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 13, 10, 13,
- 14, 14, 14, 15, 15, 15, 15, 15, 16, 6,
-];
-const CLV_MVV_2_CODES: &[u16] = &[
- 0xFFFF, 0x7FE7, 0x7FD9, 0x7FE6, 0x7FE5, 0x7FCE, 0x3FD6, 0x3FD3,
- 0x3F9C, 0x1FB2, 0x0F7A, 0x1FB5, 0x3FA8, 0x3FDD, 0x3FE5, 0x7FD0,
- 0x7FEA, 0x7FEC, 0x7FEF, 0x7FDB, 0xFFF3, 0xFFF5, 0xFFE2, 0xFFEB,
- 0x7FEB, 0x7FE0, 0x3FA7, 0x3F84, 0x3F79, 0x1FAE, 0x1F70, 0x0F78,
- 0x0FAA, 0x1FAA, 0x3F76, 0x3F7E, 0x3FAC, 0x7FE1, 0x7FDD, 0xFFEC,
- 0xFFEE, 0xFFF8, 0xFFF9, 0xFFEA, 0xFFE4, 0x3FE1, 0x3FBA, 0x3FC5,
- 0x3FB9, 0x3FA1, 0x3FAA, 0x1F8B, 0x1F8D, 0x1F8E, 0x3FA6, 0x3FA9,
- 0x3FC4, 0x3FBC, 0x3FC6, 0x3FDB, 0xFFE3, 0xFFE1, 0xFFFB, 0x7FD4,
- 0x7FCC, 0x3FCD, 0x3F88, 0x3F7C, 0x1FA1, 0x1FA2, 0x1F95, 0x1F77,
- 0x0F95, 0x0F79, 0x0F97, 0x1F78, 0x1F96, 0x1FA3, 0x1FA4, 0x3F7F,
- 0x3F8B, 0x3FCB, 0x7FCF, 0x7FD5, 0xFFF6, 0x3FD7, 0x3FE0, 0x3F91,
- 0x1F7B, 0x0FB4, 0x0FA5, 0x0FA6, 0x03D5, 0x03CB, 0x03BF, 0x03CC,
- 0x03D6, 0x0FA7, 0x0FA8, 0x0FB5, 0x1F7D, 0x3F87, 0x3FD2, 0x3FDF,
- 0xFFF0, 0x3F95, 0x3F8A, 0x3F96, 0x1FB7, 0x1F9F, 0x0F9F, 0x0F8F,
- 0x0F76, 0x03D1, 0x03BC, 0x0067, 0x03BD, 0x03D2, 0x0F77, 0x0F90,
- 0x0FA0, 0x1FA0, 0x1FB9, 0x3F97, 0x3F98, 0x3F99, 0x3FC3, 0x3FAF,
- 0x1F81, 0x0FA9, 0x0F91, 0x0F7E, 0x0F68, 0x03B2, 0x01C6, 0x00D4,
- 0x0062, 0x00D5, 0x01C7, 0x03B3, 0x0F6A, 0x0F81, 0x0F93, 0x0FAC,
- 0x1F83, 0x3FB3, 0x3FB4, 0x3FC7, 0x3FBB, 0x1F86, 0x0FAF, 0x0F98,
- 0x0F84, 0x0F6D, 0x03B8, 0x01CC, 0x00DA, 0x0065, 0x00DB, 0x01CD,
- 0x03B9, 0x0F6F, 0x0F86, 0x0F9B, 0x0FB1, 0x1F88, 0x3FB8, 0x3FC9,
- 0x3FDC, 0x3F80, 0x1FB3, 0x1F93, 0x0F87, 0x0F72, 0x07B0, 0x03B0,
- 0x01D4, 0x00E0, 0x0061, 0x00E1, 0x01D5, 0x03B1, 0x07B1, 0x0F73,
- 0x0F88, 0x1F94, 0x1FB4, 0x3F81, 0x3FD4, 0x3F9E, 0x1F99, 0x1F73,
- 0x0F89, 0x03C4, 0x03C0, 0x01CE, 0x00D0, 0x005C, 0x0028, 0x0010,
- 0x0029, 0x005D, 0x00D1, 0x01CF, 0x03C1, 0x03C5, 0x0F8A, 0x1F74,
- 0x1F9A, 0x3FA4, 0x1FAC, 0x1F8C, 0x1F7E, 0x1F71, 0x07B2, 0x03CF,
- 0x01C4, 0x00DC, 0x005A, 0x0012, 0x0000, 0x0013, 0x005B, 0x00DD,
- 0x01C5, 0x03D0, 0x07B3, 0x1F72, 0x1F7F, 0x1F8F, 0x1FAD, 0x3FAB,
- 0x1F9B, 0x1F75, 0x0F8B, 0x03C6, 0x03C2, 0x01D0, 0x00D2, 0x005E,
- 0x002A, 0x0011, 0x002B, 0x005F, 0x00D3, 0x01D1, 0x03C3, 0x03C7,
- 0x0F8C, 0x1F76, 0x1F9C, 0x3FAD, 0x3FCF, 0x3F85, 0x1FBA, 0x1F91,
- 0x0F7D, 0x0F70, 0x07AE, 0x01D6, 0x01D2, 0x00DE, 0x0060, 0x00DF,
- 0x01D3, 0x01D7, 0x07AF, 0x0F71, 0x0F7F, 0x1F92, 0x1FAF, 0x3F7B,
- 0x3FD0, 0x3FC0, 0x3FB1, 0x1F82, 0x0FAB, 0x0F92, 0x0F80, 0x0F69,
- 0x03B4, 0x01C8, 0x00D6, 0x0063, 0x00D7, 0x01C9, 0x03B5, 0x0F6B,
- 0x0F82, 0x0F94, 0x0FAD, 0x1F84, 0x3FB5, 0x3FC2, 0x3FB6, 0x3FBF,
- 0x1F85, 0x0FAE, 0x0F96, 0x0F83, 0x0F6C, 0x03B6, 0x01CA, 0x00D8,
- 0x0064, 0x00D9, 0x01CB, 0x03B7, 0x0F6E, 0x0F85, 0x0F99, 0x0FB0,
- 0x1F87, 0x3FB0, 0x3FB2, 0x3F93, 0x3F86, 0x3F8E, 0x1FB1, 0x1F9D,
- 0x0F9A, 0x0F8D, 0x0F74, 0x03CD, 0x03BA, 0x0066, 0x03BB, 0x03CE,
- 0x0F75, 0x0F8E, 0x0F9C, 0x1F9E, 0x1FB0, 0x3F8C, 0x3F94, 0x3F8D,
- 0xFFFC, 0x3FCA, 0x3FD5, 0x3F8F, 0x1F79, 0x0FB2, 0x0FA1, 0x0FA2,
- 0x03D3, 0x03C9, 0x03BE, 0x03CA, 0x03D4, 0x0FA3, 0x0FA4, 0x0FB3,
- 0x1F7A, 0x3F90, 0x3FE3, 0x3FD8, 0xFFF2, 0x7FD7, 0x7FCD, 0x3FE4,
- 0x3F92, 0x3F82, 0x1FA6, 0x1FA8, 0x1F98, 0x1F7C, 0x0F9D, 0x0F7B,
- 0x0F9E, 0x1F80, 0x1F97, 0x1FA7, 0x1FA5, 0x3F7A, 0x3F89, 0x3FDA,
- 0x7FD2, 0x7FD6, 0xFFFE, 0xFFED, 0xFFE8, 0x3FCC, 0x3FBD, 0x3FAE,
- 0x3FC1, 0x3F9F, 0x3F9A, 0x1F89, 0x1F90, 0x1F8A, 0x3FA3, 0x3FA0,
- 0x3FC8, 0x3FBE, 0x3FB7, 0x3FD1, 0xFFE7, 0xFFE9, 0xFFFD, 0xFFF4,
- 0xFFE5, 0xFFEF, 0x7FD8, 0x7FDC, 0x3FA2, 0x3F83, 0x3F78, 0x1FA9,
- 0x0FB6, 0x0F7C, 0x0FB7, 0x1FAB, 0x3F77, 0x3F7D, 0x3F9B, 0x7FDE,
- 0x7FED, 0xFFE6, 0xFFE0, 0xFFF7, 0xFFF1, 0x7FDA, 0x7FE9, 0x7FE2,
- 0x7FE3, 0x7FD1, 0x3FD9, 0x3FE2, 0x3FA5, 0x1FB8, 0x03C8, 0x1FB6,
- 0x3F9D, 0x3FDE, 0x3FCE, 0x7FD3, 0x7FEE, 0x7FDF, 0x7FE8, 0x7FE4,
- 0xFFFA, 0x002C,
-];
-const CLV_MVV_2_SYMS: &[u16] = &[
- 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6,
- 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6,
- 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0xF6F7, 0xF7F7, 0xF8F7,
- 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, 0xFFF7, 0x00F7,
- 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, 0x07F7, 0x08F7,
- 0x09F7, 0x0AF7, 0xF6F8, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8,
- 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8,
- 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0x0AF8, 0xF6F9,
- 0xF7F9, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9,
- 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9,
- 0x07F9, 0x08F9, 0x09F9, 0x0AF9, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA,
- 0x0AFA, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB,
- 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB,
- 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, 0xF6FC, 0xF7FC,
- 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC,
- 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC,
- 0x08FC, 0x09FC, 0x0AFC, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD,
- 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD,
- 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD,
- 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0xF6FF, 0xF7FF, 0xF8FF,
- 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF,
- 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF,
- 0x09FF, 0x0AFF, 0xF600, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00,
- 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300,
- 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0x0A00, 0xF601,
- 0xF701, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01,
- 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601,
- 0x0701, 0x0801, 0x0901, 0x0A01, 0xF602, 0xF702, 0xF802, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902,
- 0x0A02, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03,
- 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403,
- 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, 0xF604, 0xF704,
- 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04,
- 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704,
- 0x0804, 0x0904, 0x0A04, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05,
- 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205,
- 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05,
- 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0xF607, 0xF707, 0xF807,
- 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007,
- 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807,
- 0x0907, 0x0A07, 0xF608, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08,
- 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308,
- 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0x0A08, 0xF609,
- 0xF709, 0xF809, 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09,
- 0xFF09, 0x0009, 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609,
- 0x0709, 0x0809, 0x0909, 0x0A09, 0xF60A, 0xF70A, 0xF80A, 0xF90A,
- 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A,
- 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A,
- 0x0A0A, 0x0B0B,
-];
-const CLV_MVV_2_ESCAPE: u16 = 0x0B0B;
-
-const CLV_BIASV_2_BITS: &[u8] = &[
- 16, 15, 14, 13, 13, 13, 13, 13, 12, 12, 11, 10, 10, 9, 9, 8,
- 7, 6, 5, 4, 3, 1, 3, 4, 5, 7, 7, 8, 9, 9, 10, 10,
- 10, 12, 12, 13, 13, 13, 13, 13, 14, 16, 15, 15,
-];
-const CLV_BIASV_2_CODES: &[u16] = &[
- 0xFFFE, 0x7FFD, 0x3FFC, 0x1FFC, 0x1FFB, 0x1FF8, 0x1FF7, 0x1FF4,
- 0x0FF8, 0x0FF7, 0x07FA, 0x03FB, 0x03F8, 0x01FA, 0x01F9, 0x00FA,
- 0x007B, 0x003C, 0x001C, 0x000C, 0x0004, 0x0000, 0x0005, 0x000D,
- 0x001D, 0x007A, 0x007C, 0x00FB, 0x01F8, 0x01FB, 0x03F9, 0x03FA,
- 0x03FC, 0x0FF6, 0x0FF9, 0x1FF5, 0x1FF9, 0x1FF6, 0x1FFA, 0x1FFD,
- 0x3FFD, 0xFFFF, 0x7FFE, 0x7FFC,
-];
-const CLV_BIASV_2_SYMS: &[u16] = &[
- 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8,
- 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8,
- 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008,
- 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, 0x0028,
- 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, 0x0048,
- 0x004C, 0x0050, 0x0054, 0x0100,
-];
-
diff --git a/nihav-core/src/codecs/mod.rs b/nihav-core/src/codecs/mod.rs
index f3fabf3..76c683d 100644
--- a/nihav-core/src/codecs/mod.rs
+++ b/nihav-core/src/codecs/mod.rs
@@ -238,48 +238,9 @@ pub struct DecoderInfo {
#[cfg(any(feature="h263"))]
pub mod blockdsp;
-#[cfg(feature="decoder_clearvideo")]
-mod clearvideo;
-#[cfg(feature="decoder_gdvvid")]
-mod gremlinvideo;
#[cfg(feature="h263")]
pub mod h263;
-#[cfg(feature="decoder_aac")]
-mod aac;
-#[cfg(feature="decoder_atrac3")]
-mod atrac3;
-#[cfg(feature="decoder_pcm")]
-mod pcm;
-#[cfg(feature="decoder_sipro")]
-mod sipro;
-#[cfg(feature="decoder_ts102366")]
-mod ts102366;
-
-const DECODERS: &[DecoderInfo] = &[
-#[cfg(feature="decoder_clearvideo")]
- DecoderInfo { name: "clearvideo", get_decoder: clearvideo::get_decoder },
-#[cfg(feature="decoder_clearvideo")]
- DecoderInfo { name: "clearvideo_rm", get_decoder: clearvideo::get_decoder_rm },
-
-#[cfg(feature="decoder_pcm")]
- DecoderInfo { name: "pcm", get_decoder: pcm::get_decoder },
-#[cfg(feature="decoder_sipro")]
- DecoderInfo { name: "sipro", get_decoder: sipro::get_decoder },
-#[cfg(feature="decoder_ts102366")]
- DecoderInfo { name: "ac3", get_decoder: ts102366::get_decoder },
-#[cfg(feature="decoder_atrac3")]
- DecoderInfo { name: "atrac3", get_decoder: atrac3::get_decoder },
-#[cfg(feature="decoder_aac")]
- DecoderInfo { name: "aac", get_decoder: aac::get_decoder },
-];
-
-pub fn core_register_all_codecs(rd: &mut RegisteredDecoders) {
- for decoder in DECODERS.into_iter() {
- rd.add_decoder(decoder.clone());
- }
-}
-
pub struct RegisteredDecoders {
decs: Vec<DecoderInfo>,
}
diff --git a/nihav-core/src/codecs/pcm.rs b/nihav-core/src/codecs/pcm.rs
deleted file mode 100644
index 2a0e510..0000000
--- a/nihav-core/src/codecs/pcm.rs
+++ /dev/null
@@ -1,65 +0,0 @@
-use crate::formats::*;
-use super::*;
-
-struct PCMDecoder { chmap: NAChannelMap }
-
-impl PCMDecoder {
- fn new() -> Self {
- PCMDecoder { chmap: NAChannelMap::new() }
- }
-}
-
-const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
-const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R];
-
-fn get_default_chmap(nch: u8) -> NAChannelMap {
- let mut chmap = NAChannelMap::new();
- match nch {
- 1 => chmap.add_channels(&CHMAP_MONO),
- 2 => chmap.add_channels(&CHMAP_STEREO),
- _ => (),
- }
- chmap
-}
-
-fn get_duration(ainfo: &NAAudioInfo, duration: Option<u64>, data_size: usize) -> u64 {
- if duration == None {
- let size_bits = (data_size as u64) * 8;
- let blk_size = (ainfo.get_channels() as u64) * (ainfo.get_format().get_bits() as u64);
- size_bits / blk_size
- } else {
- duration.unwrap() as u64
- }
-}
-
-impl NADecoder for PCMDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- self.chmap = get_default_chmap(ainfo.get_channels());
- if self.chmap.num_channels() == 0 { return Err(DecoderError::InvalidData); }
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- let duration = get_duration(&ainfo, pkt.get_duration(), pkt.get_buffer().len());
- let pktbuf = pkt.get_buffer();
- let mut buf: Vec<u8> = Vec::with_capacity(pktbuf.len());
- buf.clone_from(&pktbuf);
- let abuf = NAAudioBuffer::new_from_buf(ainfo, Rc::new(RefCell::new(buf)), self.chmap.clone());
- let mut frm = NAFrame::new_from_pkt(pkt, info, NABufferType::AudioPacked(abuf));
- frm.set_duration(Some(duration));
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- } else {
- Err(DecoderError::InvalidData)
- }
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(PCMDecoder::new())
-}
diff --git a/nihav-core/src/codecs/sipro.rs b/nihav-core/src/codecs/sipro.rs
deleted file mode 100644
index 882d90c..0000000
--- a/nihav-core/src/codecs/sipro.rs
+++ /dev/null
@@ -1,1584 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use super::*;
-use crate::io::bitreader::*;
-
-use std::f32::consts::PI;
-
-#[derive(Clone,Copy,PartialEq)]
-enum SiproMode {
- Mode16k,
- Mode8_5k,
- Mode6_5k,
- Mode5k,
-}
-
-impl SiproMode {
- fn is16k(&self) -> bool { *self == SiproMode::Mode16k }
-}
-
-const SIPRO_MODE_FROM_IDX: [SiproMode; 4] = [
- SiproMode::Mode16k, SiproMode::Mode8_5k, SiproMode::Mode6_5k, SiproMode::Mode5k
-];
-
-const EXCITATION_OFFSET: usize = 281 + 10 + 1;
-
-struct SiproDecoder {
- chmap: NAChannelMap,
- ainfo: NAAudioInfo,
- info: Rc<NACodecInfo>,
- mode: &'static SiproModeInfo,
- mode_type: SiproMode,
-
- pred_switch: bool,
- vq_idx: [usize; 5],
- pitch_delay: [usize; 5],
- gp_index: [usize; 5],
- fc_index: [[i16; 10]; 5],
- gc_index: [usize; 5],
- npulses: usize,
- pulse_data: [i16; 20],
-
- pitch_lag_prev: usize,
- prev_pitch_gain: f32,
- avg_energy: f32,
- gain_mem: f32,
-
- lsf_hist: [f32; 16],
- lsp_hist: [f32; 16],
- energy_hist: [f32; 4],
- sf_filter: [[f32; 16]; 5],
- excitation: [f32; 512+64],
- synth: [f32; 256],
- synth_hist: [f32; 16],
- ir: [f32; 80],
- fix_vec: [f32; 80],
-
- postfilt_5k: [f32; 256],
- postfilt_5k_mem1: [f32; 10],
- postfilt_5k_mem2: [f32; 10],
- postfilt_5k_tilt: f32,
- postfilt_5k_gain: f32,
-
- postfilt_16k_preemph: [f32; 16],
- postfilt_16k_filt: [f32; 16],
- postfilt_16k_filt_prev: [f32; 16],
- postfilt_16k_buf: [f32; 256],
-
- iir_state: [f32; 2],
-
- pitch_int: usize,
- prev_pitch: usize,
-}
-
-impl SiproDecoder {
- fn new() -> Self {
- SiproDecoder {
- chmap: NAChannelMap::new(),
- ainfo: NAAudioInfo::new(0, 1, SND_F32P_FORMAT, 0),
- info: NACodecInfo::new_dummy(),
- mode: &SIPRO_MODES[0],
- mode_type: SiproMode::Mode5k,
-
- pred_switch: false,
- vq_idx: [0; 5],
- pitch_delay: [0; 5],
- gp_index: [0; 5],
- fc_index: [[0; 10]; 5],
- gc_index: [0; 5],
- npulses: 0,
- pulse_data: [0; 20],
-
- pitch_lag_prev: 0,
- prev_pitch_gain: 0.0,
- avg_energy: 0.0,
- gain_mem: 0.0,
- pitch_int: 0,
- prev_pitch: 0,
-
- lsf_hist: [0.0; 16],
- lsp_hist: [0.0; 16],
- energy_hist: [0.0; 4],
- sf_filter: [[0.0; 16]; 5],
- excitation: [0.0; 512+64],
- synth: [0.0; 256],
- synth_hist: [0.0; 16],
- ir: [0.0; 80],
- fix_vec: [0.0; 80],
-
- postfilt_5k: [0.0; 256],
- postfilt_5k_mem1: [0.0; 10],
- postfilt_5k_mem2: [0.0; 10],
- postfilt_5k_tilt: 0.0,
- postfilt_5k_gain: 0.0,
-
- postfilt_16k_preemph: [0.0; 16],
- postfilt_16k_filt: [0.0; 16],
- postfilt_16k_filt_prev: [0.0; 16],
- postfilt_16k_buf: [0.0; 256],
-
- iir_state: [0.0; 2],
- }
- }
-
- fn unpack_frame(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- if self.mode.pred {
- self.pred_switch = br.read_bool()?;
- } else {
- self.pred_switch = false;
- }
- for i in 0..5 {
- self.vq_idx[i] = br.read(self.mode.vq_idx_bits[i])? as usize;
- }
- for sf in 0..self.mode.subframes {
- self.pitch_delay[sf] = br.read(self.mode.pitch_delay_bits[sf])? as usize;
- self.gp_index[sf] = br.read(self.mode.gp_idx_bits)? as usize;
- for i in 0..self.mode.fc_indices {
- self.fc_index[sf][i] = br.read(self.mode.fc_idx_bits[i])? as i16;
- }
- self.gc_index[sf] = br.read(self.mode.gc_idx_bits)? as usize;
- }
- Ok(())
- }
- fn decode_lsf_16k(&mut self) {
- let mut filter: [f32; 16] = [0.0; 16];
- let mut newfilt: [f32; 16] = [0.0; 16];
- let mut lsp: [f32; 16] = [0.0; 16];
-
- for cb in 0..4 {
- for i in 0..3 {
- filter[cb * 3 + i] = SIPRO_LSF_CODEBOOK_16K[cb][self.vq_idx[cb]][i];
- }
- }
- for i in 0..4 {
- filter[4 * 3 + i] = SIPRO_LSF_CB4_16K[self.vq_idx[4]][i];
- }
-
- if self.pred_switch {
- for i in 0..newfilt.len() {
- newfilt[i] = (filter[i] + self.lsf_hist[i]) * 0.5 + SIPRO_MEAN_LSF_16K[i];
- }
- } else {
- for i in 0..newfilt.len() {
- newfilt[i] = 0.88 * filter[i] + 0.12 * self.lsf_hist[i] + SIPRO_MEAN_LSF_16K[i];
- }
- }
- for i in 0..filter.len() {
- self.lsf_hist[i] = filter[i];
- }
-
- let mut prev: f32 = 0.0;
- for i in 0..newfilt.len() {
- newfilt[i] = newfilt[i].max(prev + SIPRO_LSF_MIN_DIST/2.0);
- prev = newfilt[i];
- filter[i] = newfilt[i].cos();
- }
-
- for i in 0..lsp.len() {
- lsp[i] = (filter[i] + self.lsp_hist[i]) * 0.5;
- }
-
- lsp2lpc_16k(&mut self.sf_filter[0], &lsp);
- lsp2lpc_16k(&mut self.sf_filter[1], &filter);
- for i in 0..filter.len() {
- self.lsp_hist[i] = filter[i];
- }
-
- for i in 0..16 {
- self.synth[i] = self.synth_hist[i];
- }
- }
- fn decode_lsf_lbr(&mut self) {
- let mut filter: [f32; 10] = [0.0; 10];
- let mut newfilt: [f32; 10] = [0.0; 10];
-
- for cb in 0..5 {
- for i in 0..2 {
- filter[cb * 2 + i] = SIPRO_LSF_CODEBOOK_LBR[cb][self.vq_idx[cb]][i];
- }
- }
- for i in 0..newfilt.len() {
- newfilt[i] = filter[i] + 0.33 * self.lsf_hist[i] + SIPRO_MEAN_LSF_LBR[i];
- }
- for i in 0..8 { // maybe it's just bubble sort?
- for j in (0..i+1).rev() {
- if newfilt[j] <= newfilt[j + 1] { break; }
- let tmp = newfilt[j];
- newfilt[j] = newfilt[j + 1];
- newfilt[j + 1] = tmp;
- }
- }
-
- let mut prev: f32 = 0.0;
- for i in 0..9 {
- newfilt[i] = newfilt[i].max(prev + SIPRO_LSF_MIN_DIST);
- prev = newfilt[i];
- }
- newfilt[9] = newfilt[9].min(prev + SIPRO_LSF_MIN_DIST_LAST);
- for i in 0..filter.len() {
- self.lsf_hist[i] = filter[i];
- }
-
- for i in 0..9 {
- newfilt[i] = newfilt[i].cos();
- }
- newfilt[9] *= 6.153848 / PI;
-
- let mut interp: f32 = 0.5 / (self.mode.subframes as f32);
- for sf in 0..self.mode.subframes {
- for i in 0..newfilt.len() {
- filter[i] = newfilt[i] * interp + self.lsp_hist[i] * (1.0 - interp);
- }
- lsp2lpc_lbr(&mut self.sf_filter[sf], &filter);
- interp += 1.0 / (self.mode.subframes as f32);
- }
- for i in 0..newfilt.len() {
- self.lsp_hist[i] = newfilt[i];
- }
-
- for i in 0..10 {
- self.synth[i] = self.synth_hist[i];
- }
- }
- fn calc_pitch_16k(&mut self, sf: usize) {
- let idx = self.pitch_delay[sf];
- let pitch_idx = if sf == 0 {
- if idx < 390 {
- idx + 88
- } else {
- idx * 3 - 690
- }
- } else {
- if idx < 62 {
- (self.prev_pitch - 10).max(30).min(281 - 19) * 3 + idx - 2
- } else {
- self.prev_pitch * 3
- }
- };
- self.pitch_int = ((pitch_idx + 2) * 10923) >> 15;
- self.prev_pitch = ((pitch_idx + 1) * 10923) >> 15;
- let pitch_frac = pitch_idx + 2 - 3 * self.pitch_int;
-
- for i in 0..80 {
- let mut sum: f32 = 0.0;
- let estart = EXCITATION_OFFSET + sf * 80 - self.pitch_int + i + 1;
- for j in 0..10 {
- sum += self.excitation[estart + j] * SIPRO_SINC_16K[j * 3 + pitch_frac + 1];
- sum += self.excitation[estart - j - 1] * SIPRO_SINC_16K[j * 3 + 3 - pitch_frac - 1];
- }
- self.excitation[EXCITATION_OFFSET + sf * 80 + i] = sum;
- }
- }
- fn calc_pitch_lbr(&mut self, sf: usize) {
- let new_sf = (sf == 0) || (self.mode_type == SiproMode::Mode5k && sf == 2);
- let idx = self.pitch_delay[sf];
- let pitch_idx = if new_sf {
- if idx < 197 {
- idx + 59
- } else {
- idx * 3 - 335
- }
- } else {
- idx + (self.prev_pitch - 5).max(20).min(134) * 3 - 1
- };
- self.pitch_int = (pitch_idx * 10923) >> 15;
- let pitch_frac = (pitch_idx as i32) - (self.pitch_int as i32) * 3 - 1;
- if new_sf {
- self.prev_pitch = self.pitch_int;
- }
- let ffrac = 2 * ((pitch_frac + 2) % 3) + 2;
- let off = EXCITATION_OFFSET + sf * 48 + (if pitch_frac <= 0 { 1 } else { 0 });
- for i in 0..48 {
- let mut sum: f32 = 0.0;
- let estart = off + i - self.pitch_int;
- for j in 0..10 {
- let idx0 = ((j * 6) as i32) + ffrac;
- let idx1 = ((j * 6) as i32) + 6 - ffrac;
- sum += self.excitation[estart + j] * SIPRO_SINC_LBR[idx0 as usize];
- sum += self.excitation[estart - j - 1] * SIPRO_SINC_LBR[idx1 as usize];
- }
- self.excitation[EXCITATION_OFFSET + sf * 48 + i] = sum;
- }
- }
- fn unpack_pulses_16k(&mut self, sf: usize) {
- self.npulses = 10;
- for i in 0..5 {
- let off1 = (self.fc_index[sf][i * 2 + 0] & 0xF) * 5 + (i as i16);
- let off2 = (self.fc_index[sf][i * 2 + 1] & 0xF) * 5 + (i as i16);
- let sign = if (self.fc_index[sf][i * 2 + 1] & 0x10) != 0 { -1 } else { 1 };
- self.pulse_data[i * 4 + 0] = off1;
- self.pulse_data[i * 4 + 1] = if off1 < off2 { -sign } else { sign };
- self.pulse_data[i * 4 + 2] = off2;
- self.pulse_data[i * 4 + 3] = sign;
- }
- self.fix_vec = [0.0; 80];
- let pitch_frac = SIPRO_GAIN_PITCH_CB_16K[self.gp_index[sf]].min(1.0);
- for i in 0..10 {
- let mut scale = self.pulse_data[i * 2 + 1] as f32;
- let off = self.pulse_data[i * 2 + 0] as usize;
- for j in (off..80).step_by(self.prev_pitch) {
- self.fix_vec[j] += scale;
- scale *= pitch_frac;
- }
- }
- }
- fn unpack_pulses_8_5k(&mut self, sf: usize) {
- self.npulses = 6;
- for i in 0..3 {
- self.pulse_data[i * 4 + 0] = 3 * ((self.fc_index[sf][i] >> 4) & 0xF) + (i as i16);
- self.pulse_data[i * 4 + 2] = 3 * ((self.fc_index[sf][i] >> 0) & 0xF) + (i as i16);
- self.pulse_data[i * 4 + 1] = if (self.fc_index[sf][i] & 0x100) != 0 { -1 } else { 1 };
- self.pulse_data[i * 4 + 3] = if (self.fc_index[sf][i] & 0x100) != 0 { -1 } else { 1 };
- if self.pulse_data[i * 4 + 2] < self.pulse_data[i * 4 + 0] {
- self.pulse_data[i * 4 + 3] = -self.pulse_data[i * 4 + 3];
- }
- }
- self.unpack_pulses_common();
- }
- fn unpack_pulses_6_5k(&mut self, sf: usize) {
- self.npulses = 3;
- for i in 0..3 {
- self.pulse_data[i * 2 + 0] = 3 * (self.fc_index[sf][i] & 0xF) + (i as i16);
- self.pulse_data[i * 2 + 1] = if (self.fc_index[sf][i] & 0x10) != 0 { -1 } else { 1 };
- }
- self.unpack_pulses_common();
- }
- fn unpack_pulses_5k(&mut self, sf: usize) {
- if self.prev_pitch_gain < 0.8 {
- self.npulses = 3;
- let mut cw = self.fc_index[sf][0];
- let off = if (cw & 0x200) != 0 { 2 } else { 0 };
- for i in 0..3 {
- self.pulse_data[i * 2 + 0] = (cw & 7) * 6 + 4 - (i as i16) * 2;
- self.pulse_data[i * 2 + 1] = if ((self.pulse_data[i * 2 + 0] + off) & 3) != 0 { -1 } else { 1 };
- cw >>= 3;
- }
- } else {
- self.npulses = 2;
- let off = (self.fc_index[sf][0] >> 8) & 1;
- self.pulse_data[0] = 3 * ((self.fc_index[sf][0] >> 4) & 0xF) + off;
- self.pulse_data[1] = if (self.fc_index[sf][0] & 0x200) != 0 { -1 } else { 1 };
- self.pulse_data[2] = 3 * ((self.fc_index[sf][0] >> 0) & 0xF) + off + 1;
- self.pulse_data[3] = -self.pulse_data[1];
- }
- self.unpack_pulses_common();
- }
- fn unpack_pulses_common(&mut self) {
- for i in 0..48 {
- self.fix_vec[i] = 0.0;
- }
- for i in 0..self.npulses {
- let off = self.pulse_data[i * 2] as usize;
- let scale = self.pulse_data[i * 2 + 1] as f32;
- for j in off..48 {
- self.fix_vec[j] += scale * self.ir[10 + j - off];
- }
- }
- }
- fn eval_ir(&mut self, sf: usize) {
- let mut tmp: [f32; 48 + 1] = [0.0; 48 + 1];
- let mut filt: [f32; 16] = [0.0; 16];
- tmp[0] = 1.0;
- for i in 0..10 {
- tmp[i + 1] = self.sf_filter[sf][i] * SIPRO_POW_0_55[i];
- filt[i] = self.sf_filter[sf][i] * SIPRO_POW_0_7[i];
- }
- synth_filter(&mut self.ir, 10, &filt, &tmp, 48, 10);
- for i in self.pitch_int..48 {
- self.ir[10 + i] += self.mode.pitch_sharp_factor * self.ir[10 + i - self.pitch_int];
- }
- }
- fn update_gain_16k(&mut self, sf: usize) {
- let mut energy: f64 = 0.0;
- for i in 0..80 {
- energy += (self.fix_vec[i] as f64) * (self.fix_vec[i] as f64);
- }
- let ehist = ((0.8 * self.energy_hist[0] + 0.6 * self.energy_hist[1]) as f64) - 71.30899869919435856603;
- let rms = 8.94427190999915878559 * (10.0f64.ln() / 20.0 * ehist).exp() / (0.01 + energy).sqrt();
- let gain = SIPRO_GAIN_CB_16K[self.gc_index[sf]] * (rms as f32);
-
- self.energy_hist[1] = self.energy_hist[0];
- self.energy_hist[0] = SIPRO_GAIN_DB_CB_16K[self.gc_index[sf]];
-
- let exc = &mut self.excitation[EXCITATION_OFFSET + sf * 80..][..80];
- for i in 0..80 {
- exc[i] = exc[i] * SIPRO_GAIN_PITCH_CB_16K[self.gp_index[sf]] + self.fix_vec[i] * gain;
- }
- }
- fn update_gain_lbr(&mut self, sf: usize) {
- let gain0 = SIPRO_GAIN_CB_LBR[self.gc_index[sf]][0];
- let gain1 = SIPRO_GAIN_CB_LBR[self.gc_index[sf]][1];
- self.prev_pitch_gain = gain0;
-
- self.avg_energy = 0.01;
- for el in self.fix_vec.iter().take(48) {
- self.avg_energy += *el * *el;
- }
- self.avg_energy /= 48.0;
-
- let mut sum: f32 = -56.30899869919435856603;
- for i in 0..4 {
- sum += self.energy_hist[i] * SIPRO_GAIN_PRED[i];
- }
- for i in 0..3 {
- self.energy_hist[i] = self.energy_hist[i + 1];
- }
- self.energy_hist[3] = 20.0 * gain1.log10();
-
- let gain = ((gain1 as f64) * ((sum as f64) * (10.0f64).ln() * 0.05).exp() / (self.avg_energy as f64).sqrt()) as f32;
- let exc = &mut self.excitation[EXCITATION_OFFSET + sf * 48..][..48];
- for i in 0..48 {
- exc[i] = exc[i] * gain0 + self.fix_vec[i] * gain;
- }
-
- let pitch_gain = (0.5 * gain0 * gain0).min(0.4);
- self.gain_mem = (0.7 * self.gain_mem + 0.3 * pitch_gain).min(pitch_gain);
-
- let gain = gain * self.gain_mem;
-
- for i in 0..48 {
- self.fix_vec[i] = exc[i] - gain * self.fix_vec[i];
- }
- }
- fn synth_subframe_16k(&mut self, sf: usize) {
- synth_filter(&mut self.synth, 16 + sf * 80, &self.sf_filter[sf], &self.excitation[EXCITATION_OFFSET + sf * 80..], 80, 16);
- }
- fn synth_subframe_lbr(&mut self, sf: usize) {
- if self.mode_type == SiproMode::Mode5k {
- self.postfilter_5k_sf(sf);
- }
- synth_filter(&mut self.synth, 10 + sf * 48, &self.sf_filter[sf], &self.fix_vec, 48, 10);
- }
- fn postfilter_16k(&mut self) {
- let mut filt: [f32; 16] = [0.0; 16];
-
- for i in 0..filt.len() {
- filt[i] = self.postfilt_16k_filt_prev[i] * SIPRO_POW_0_5[i];
- }
-
- let mut tmp: [f32; 64] = [0.0; 64];
- for i in 0..16 {
- tmp[i] = self.postfilt_16k_preemph[i];
- }
- synth_filter(&mut tmp, 16, &self.postfilt_16k_filt, &self.synth[16..], 30, 16);
- for i in 0..16 {
- self.synth[i] = self.postfilt_16k_preemph[i];
- }
- let mut tsrc: [f32; 30] = [0.0; 30];
- tsrc.copy_from_slice(&self.synth[16..][..30]);
- synth_filter(&mut self.synth, 16, &filt, &tsrc, 30, 16);
- for i in 0..16 {
- self.postfilt_16k_buf[30 - 16 + i] = self.synth[30 + i];
- }
- synth_filter(&mut self.postfilt_16k_buf, 30, &filt, &self.synth[30 + 16..], 2 * 80 - 30, 16);
- self.postfilt_16k_filt = filt;
- for i in 0..16 {
- self.postfilt_16k_preemph[i] = self.postfilt_16k_buf[2 * 80 - 16 + i];
- self.postfilt_16k_filt_prev[i] = self.sf_filter[1][i];
- }
-
- for i in 0..30 {
- self.postfilt_16k_buf[i] = tmp[i + 16] + (i as f32) * (self.synth[i + 16] - tmp[i + 16]) / 30.0;
- }
- }
- fn postfilter_5k_sf(&mut self, sf: usize) {
- let mut d: [f32; 10] = [0.0; 10];
- let mut n: [f32; 10] = [0.0; 10];
-
- for i in 0..10 {
- d[i] = self.sf_filter[sf][i] * SIPRO_POW_0_75[i];
- n[i] = self.sf_filter[sf][i] * SIPRO_POW_0_5[i];
- }
-
- let mut tmp: [f32; 48 + 10] = [0.0; 48 + 10];
- for i in 0..10 {
- tmp[i] = self.postfilt_5k_mem1[i];
- }
- synth_filter(&mut tmp, 10, &d, &self.fix_vec, 48, 10);
- for i in 0..10 {
- self.postfilt_5k_mem1[i] = tmp[i + 48];
- }
-
- let tilt = tmp[48 + 10 - 1];
- for i in (10+1..48+10).rev() {
- tmp[i] -= 0.4 * tmp[i - 1];
- }
- tmp[10] -= 0.4 * self.postfilt_5k_tilt;
- self.postfilt_5k_tilt = tilt;
-
- for i in 0..10 {
- tmp[i] = self.postfilt_5k_mem2[i];
- }
- for i in 0..10 {
- self.postfilt_5k_mem2[i] = tmp[i + 48];
- }
-
- for i in 0..48 { // almost but not exactly like synth_filter(fix_vec, 0, -n, tmp, 48, 10)
- self.fix_vec[i] = tmp[i + 10];
- for j in 0..10 {
- self.fix_vec[i] += n[j] * tmp[i + 10 - j - 1];
- }
- }
-
- synth_filter(&mut self.postfilt_5k, 10 + sf * 48, &self.sf_filter[sf],
- &self.excitation[EXCITATION_OFFSET + sf * 48..], 48, 10);
- }
- fn postfilter_5k(&mut self) {
- for sf in 0..self.mode.subframes {
- let src = &self.postfilt_5k[10 + sf * 48..][..48];
- let mut fenergy: f32 = 0.0;
- for el in src.iter() {
- fenergy += *el * *el;
- }
- let mut senergy: f32 = 0.0;
- {
- let src = &self.synth[10 + sf * 48..][..48];
- for el in src.iter() {
- senergy += *el * *el;
- }
- }
-
- let gain = if senergy != 0.0 { 0.1 * (fenergy / senergy).sqrt() } else { 0.1 };
-
- let dst = &mut self.synth[10 + sf * 48..][..48];
- for el in dst.iter_mut() {
- self.postfilt_5k_gain *= 0.9;
- self.postfilt_5k_gain += gain;
- *el *= self.postfilt_5k_gain;
- }
- }
- for i in 0..10 {
- self.postfilt_5k[i] = self.postfilt_5k[i + self.mode.subframes * 48];
- }
- }
- fn output_16k(&mut self, dst: &mut [f32]) {
- for i in 0..16 {
- self.synth_hist[i] = self.synth[80 * 2 + i];
- }
- for i in 0..EXCITATION_OFFSET {
- self.excitation[i] = self.excitation[80 * 2 + i];
- }
- self.postfilter_16k();
- for i in 0..80 * 2 {
- dst[i] = self.postfilt_16k_buf[i];
- }
- }
- fn output_lbr(&mut self, dst: &mut [f32]) {
- let out_size = self.mode.subframe_len * self.mode.subframes;
- for i in 0..10 {
- self.synth_hist[i] = self.synth[i + out_size];
- }
- if self.mode_type == SiproMode::Mode5k {
- self.postfilter_5k();
- }
- for i in 0..EXCITATION_OFFSET {
- self.excitation[i] = self.excitation[i + out_size];
- }
- for i in 0..out_size {
- let x = 0.939805806 * self.synth[i + 10] + 1.93307352 * self.iir_state[0] - 0.935891986 * self.iir_state[1];
- let y = x - 1.99997 * self.iir_state[0] + self.iir_state[1];
- self.iir_state[1] = self.iir_state[0];
- self.iir_state[0] = x;
- dst[i] = y;
- }
- }
-}
-
-fn lsp2poly(lsp: &[f32], poly: &mut [f64], order: usize) {
- poly[0] = 1.0;
- poly[1] = -2.0 * (lsp[0] as f64);
- for i in 1..order {
- poly[i + 1] = -2.0 * (lsp[2 * i] as f64) * poly[i] + 2.0 * poly[i - 1];
- for j in (2..i+1).rev() {
- poly[j] += -2.0 * (lsp[2 * i] as f64) * poly[j - 1] + poly[j - 2];
- }
- poly[1] += -2.0 * (lsp[2 * i] as f64);
- }
-}
-
-fn lsp2lpc_16k(lpc: &mut [f32], lsp: &[f32]) {
- let mut a: [f64; 10] = [0.0; 10];
- let mut b: [f64; 10] = [0.0; 10];
- lsp2poly(&lsp[0..], &mut a, 8);
- lsp2poly(&lsp[1..], &mut b, 8);
- for i in 0..8 {
- let ta = a[8 - i] + a[7 - i];
- let tb = b[8 - i] - b[7 - i];
- lpc[7 - i] = ((ta + tb) * 0.5) as f32;
- lpc[8 + i] = ((ta - tb) * 0.5) as f32;
- }
-}
-fn lsp2lpc_lbr(lpc: &mut [f32], lsp: &[f32]) {
- let mut a: [f64; 6] = [0.0; 6];
- let mut b: [f64; 6] = [0.0; 6];
- lsp2poly(&lsp[0..], &mut a[0..], 5);
- lsp2poly(&lsp[1..], &mut b[1..], 4);
-
- let ascale = (1.0 + lsp[9]) as f64;
- let bscale = (1.0 - lsp[9]) as f64;
- for i in 1..5 {
- let ta = ascale * a[i];
- let tb = bscale * (b[i + 1] - b[i - 1]);
- lpc[i - 1] = ((ta + tb) * 0.5) as f32;
- lpc[9 - i] = ((ta - tb) * 0.5) as f32;
- }
- lpc[4] = (ascale * a[5] * 0.5) as f32;
- lpc[9] = lsp[9];
-}
-
-fn synth_filter(dst: &mut [f32], doff: usize, filt: &[f32], src: &[f32], len: usize, order: usize) {
- for i in 0..len {
- dst[doff + i] = src[i];
- for j in 0..order {
- dst[doff + i] -= filt[j] * dst[doff + i - j - 1];
- }
- }
-}
-
-const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
-
-impl NADecoder for SiproDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- let mut found = false;
- for i in 0..SIPRO_MODES.len() {
- if SIPRO_MODES[i].block_align == ainfo.get_block_len() {
- self.mode = &SIPRO_MODES[i];
- self.mode_type = SIPRO_MODE_FROM_IDX[i];
- found = true;
- break;
- }
- }
- validate!(found);
-
- let order = if self.mode_type.is16k() { 16 } else { 10 };
- for i in 0..order {
- self.lsp_hist[i] = (((i + 1) as f32) * PI / ((order + 1) as f32)).cos();
- }
- self.energy_hist = [-14.0; 4];
- self.pitch_lag_prev = 180;
-
- self.chmap.add_channels(&CHMAP_MONO);
- self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(),
- 1,
- SND_F32P_FORMAT, 0);
- self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone()));
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- let frm_size = self.mode.block_align;
- let out_frm_size = self.mode.frames * self.mode.subframes * self.mode.subframe_len;
- let nframes = pktbuf.len() / frm_size;
-
- let duration = out_frm_size * nframes;
-
- let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?;
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut dst = adata.get_data_mut();
-
- let frame_len = self.mode.subframe_len * self.mode.subframes;
- for (input, output) in pktbuf.chunks(frm_size).zip(dst.chunks_mut(out_frm_size)) {
- let mut br = BitReader::new(input, input.len(), BitReaderMode::LE);
- for dst in output.chunks_mut(frame_len) {
- self.unpack_frame(&mut br)?;
- if self.mode_type.is16k() {
- self.decode_lsf_16k();
- } else {
- self.decode_lsf_lbr();
- }
- for i in 0..64 {
- self.ir[i] = 0.0;
- }
- for sf in 0..self.mode.subframes {
- if self.mode_type.is16k() {
- self.calc_pitch_16k(sf);
- } else {
- self.calc_pitch_lbr(sf);
- self.eval_ir(sf);
- }
- match self.mode_type {
- SiproMode::Mode16k => { self.unpack_pulses_16k(sf); },
- SiproMode::Mode8_5k => { self.unpack_pulses_8_5k(sf); },
- SiproMode::Mode6_5k => { self.unpack_pulses_6_5k(sf); },
- SiproMode::Mode5k => { self.unpack_pulses_5k(sf); },
- }
- if self.mode_type.is16k() {
- self.update_gain_16k(sf);
- } else {
- self.update_gain_lbr(sf);
- }
- if self.mode_type.is16k() {
- self.synth_subframe_16k(sf);
- } else {
- self.synth_subframe_lbr(sf);
- }
- }
- if self.mode_type.is16k() {
- self.output_16k(dst);
- } else {
- self.output_lbr(dst);
- }
- }
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(SiproDecoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_sipro() {
- let file = "assets/RV/autahi-vox.rm";
- test_decode_audio("realmedia", file, Some(5000), "sipro");
- }
-}
-
-struct SiproModeInfo {
- block_align: usize,
- frames: usize,
- subframes: usize,
- subframe_len: usize,
-
- pred: bool,
- vq_idx_bits: [u8; 5],
- pitch_delay_bits: [u8; 5],
- gp_idx_bits: u8,
- fc_indices: usize,
- fc_idx_bits: [u8; 10],
- gc_idx_bits: u8,
-
- pitch_sharp_factor: f32,
-}
-
-static SIPRO_MODES: [SiproModeInfo; 4] = [
- SiproModeInfo {
- block_align: 160/8, frames: 1, subframes: 2, subframe_len: 80,
- pred: true, vq_idx_bits: [ 7, 8, 7, 7, 7 ],
- pitch_delay_bits: [ 9, 6, 0, 0, 0 ], gp_idx_bits: 4,
- fc_indices: 10, fc_idx_bits: [ 4, 5, 4, 5, 4, 5, 4, 5, 4, 5 ],
- gc_idx_bits: 5, pitch_sharp_factor: 0.0
- },
- SiproModeInfo {
- block_align: 152/8, frames: 1, subframes: 3, subframe_len: 48,
- pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ],
- pitch_delay_bits: [ 8, 5, 5, 0, 0 ], gp_idx_bits: 0,
- fc_indices: 3, fc_idx_bits: [ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0 ],
- gc_idx_bits: 7, pitch_sharp_factor: 0.8
- },
- SiproModeInfo {
- block_align: 232/8, frames: 2, subframes: 3, subframe_len: 48,
- pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ],
- pitch_delay_bits: [ 8, 5, 5, 0, 0 ], gp_idx_bits: 0,
- fc_indices: 3, fc_idx_bits: [ 5, 5, 5, 0, 0, 0, 0, 0, 0, 0 ],
- gc_idx_bits: 7, pitch_sharp_factor: 0.8
- },
- SiproModeInfo {
- block_align: 296/8, frames: 2, subframes: 5, subframe_len: 48,
- pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ],
- pitch_delay_bits: [ 8, 5, 8, 5, 5 ], gp_idx_bits: 0,
- fc_indices: 1, fc_idx_bits: [ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
- gc_idx_bits: 7, pitch_sharp_factor: 0.85
- },
-];
-
-const SIPRO_LSF_MIN_DIST: f32 = 0.0125 * PI;
-const SIPRO_LSF_MIN_DIST_LAST: f32 = 1.3 * PI;
-
-const SIPRO_LSF_CODEBOOK_LBR: [&[[f32; 2]]; 5] = [
- SIPRO_LSF_CB0_LBR, SIPRO_LSF_CB1_LBR, SIPRO_LSF_CB2_LBR, SIPRO_LSF_CB3_LBR, SIPRO_LSF_CB4_LBR
-];
-
-const SIPRO_LSF_CB0_LBR: &[[f32; 2]] = &[
- [ 0.007587, -0.005843 ], [ 0.042163, -0.028048 ], [ -0.017147, -0.060705 ],
- [ 0.013773, -0.038108 ], [ -0.041563, -0.078571 ], [ -0.076928, -0.119343 ],
- [ 0.012654, 0.176005 ], [ 0.059737, 0.156869 ], [ 0.171767, 0.231837 ],
- [ 0.114030, 0.242047 ], [ 0.168977, 0.283101 ], [ 0.146210, 0.397961 ],
- [ 0.249446, 0.268421 ], [ 0.137074, 0.186724 ], [ -0.057736, -0.135638 ],
- [ -0.109664, -0.124611 ], [ -0.021234, -0.031174 ], [ -0.013990, -0.091819 ],
- [ -0.040046, -0.111426 ], [ -0.016830, 0.055361 ], [ 0.057815, 0.071606 ],
- [ 0.060670, 0.114436 ], [ 0.106695, 0.140838 ], [ 0.093601, 0.092793 ],
- [ 0.039593, 0.006142 ], [ -0.066589, -0.092463 ], [ -0.102589, -0.171380 ],
- [ -0.059621, -0.050671 ], [ 0.166131, 0.139773 ], [ 0.213069, 0.190761 ],
- [ 0.061820, 0.037661 ], [ 0.136471, 0.090823 ], [ -0.019789, 0.013515 ],
- [ 0.022280, 0.079473 ], [ 0.215281, 0.461959 ], [ 0.206497, 0.340077 ],
- [ 0.012249, -0.065596 ], [ 0.091345, 0.190871 ], [ 0.019506, 0.037266 ],
- [ -0.050702, -0.013223 ], [ -0.057334, 0.028943 ], [ 0.291512, 0.371415 ],
- [ -0.053467, 0.084160 ], [ 0.025372, 0.375310 ], [ 0.269995, 0.566520 ],
- [ -0.095259, -0.012353 ], [ 0.050479, 0.212893 ], [ 0.101219, 0.049320 ],
- [ 0.072426, 0.283362 ], [ -0.084116, -0.150542 ], [ -0.031485, 0.144922 ],
- [ 0.012714, 0.256910 ], [ -0.009528, 0.102768 ], [ -0.039572, 0.204967 ],
- [ -0.098800, 0.055038 ], [ 0.020719, 0.128387 ], [ -0.045559, -0.178373 ],
- [ -0.082338, 0.136933 ], [ -0.058270, 0.292806 ], [ 0.084242, 0.505112 ],
- [ 0.121825, 0.326386 ], [ -0.102658, -0.069341 ], [ 0.071675, 0.004744 ],
- [ -0.117763, -0.202608 ]
-];
-
-const SIPRO_LSF_CB1_LBR: &[[f32; 2]] = &[
- [ 0.025412, 0.006095 ], [ -0.069803, 0.010650 ], [ -0.175957, -0.185800 ],
- [ -0.139298, -0.048013 ], [ -0.156150, -0.129688 ], [ -0.160523, 0.068022 ],
- [ 0.199683, 0.259982 ], [ 0.258038, 0.236147 ], [ 0.367089, 0.304716 ],
- [ 0.251764, 0.305853 ], [ 0.394314, 0.382153 ], [ 0.448579, 0.337438 ],
- [ 0.323286, 0.425563 ], [ 0.015369, 0.123820 ], [ -0.026770, 0.083881 ],
- [ -0.112161, -0.097993 ], [ -0.221847, -0.161311 ], [ -0.050014, -0.092862 ],
- [ -0.214960, -0.398498 ], [ -0.114062, -0.241381 ], [ 0.137950, 0.138852 ],
- [ 0.031529, 0.065719 ], [ 0.208734, 0.084760 ], [ 0.157862, 0.057535 ],
- [ 0.124750, 0.011922 ], [ -0.035227, -0.154397 ], [ -0.105523, -0.291427 ],
- [ -0.073488, -0.201948 ], [ -0.224184, -0.273290 ], [ -0.168019, -0.240297 ],
- [ -0.271591, -0.384682 ], [ -0.124784, 0.014253 ], [ 0.004210, -0.110418 ],
- [ 0.074270, -0.014272 ], [ 0.053058, -0.068672 ], [ -0.090098, -0.145019 ],
- [ 0.303214, 0.210323 ], [ 0.413443, 0.272002 ], [ 0.356904, 0.230646 ],
- [ -0.035186, -0.028579 ], [ -0.117558, 0.115105 ], [ -0.159225, 0.218385 ],
- [ -0.230178, 0.172901 ], [ -0.216148, -0.110195 ], [ 0.309444, 0.101508 ],
- [ 0.250489, 0.118338 ], [ 0.293324, 0.151205 ], [ -0.023634, 0.033084 ],
- [ 0.076708, 0.114024 ], [ 0.123119, 0.087704 ], [ -0.060265, 0.126543 ],
- [ -0.223766, -0.021903 ], [ -0.241987, -0.328089 ], [ 0.205598, 0.147925 ],
- [ -0.087010, 0.064601 ], [ -0.287892, -0.286099 ], [ -0.179451, -0.350781 ],
- [ -0.219572, 0.043816 ], [ -0.217263, 0.245550 ], [ -0.286743, -0.180981 ],
- [ 0.172659, 0.112620 ], [ -0.105422, 0.176856 ], [ 0.006176, -0.051491 ],
- [ 0.099802, 0.176322 ], [ -0.186620, -0.068980 ], [ 0.164689, 0.185018 ],
- [ 0.519877, 0.376111 ], [ 0.521941, 0.533731 ], [ 0.473375, 0.439534 ],
- [ 0.214235, 0.202476 ], [ 0.579215, 0.466969 ], [ 0.310414, 0.271057 ],
- [ 0.257450, 0.058939 ], [ 0.023936, -0.169464 ], [ -0.268817, -0.064531 ],
- [ -0.174182, -0.000198 ], [ -0.268405, -0.234529 ], [ -0.296522, 0.247140 ],
- [ 0.115950, -0.072194 ], [ -0.303666, 0.149084 ], [ -0.347762, -0.011002 ],
- [ -0.223829, -0.214137 ], [ -0.278958, -0.457975 ], [ 0.135500, 0.238466 ],
- [ 0.312730, 0.342760 ], [ 0.071754, -0.125912 ], [ 0.485938, 0.260429 ],
- [ 0.037536, 0.179771 ], [ 0.391493, 0.156938 ], [ 0.397320, 0.484446 ],
- [ -0.308630, -0.342418 ], [ -0.269599, -0.128453 ], [ -0.086683, -0.043863 ],
- [ 0.421115, 0.213521 ], [ 0.082417, 0.049006 ], [ -0.087873, 0.238126 ],
- [ 0.338899, 0.166131 ], [ -0.166988, 0.147105 ], [ -0.167214, -0.294075 ],
- [ 0.588706, 0.328303 ], [ 0.207270, 0.017671 ], [ -0.141658, 0.291147 ],
- [ -0.140850, 0.374321 ], [ 0.028180, 0.322510 ], [ -0.229858, 0.328036 ],
- [ -0.060743, -0.260916 ], [ -0.011131, 0.246442 ], [ -0.058151, 0.310760 ],
- [ -0.127536, -0.186432 ], [ -0.128523, -0.334884 ], [ -0.283899, 0.077729 ],
- [ -0.031595, 0.181015 ], [ -0.329330, -0.108630 ], [ -0.215739, 0.107458 ],
- [ 0.175734, 0.327134 ], [ 0.255801, 0.176077 ], [ 0.228265, 0.396859 ],
- [ -0.370909, -0.185081 ], [ -0.355138, -0.300405 ], [ 0.061669, 0.242616 ],
- [ 0.104489, 0.307995 ], [ -0.320021, -0.234002 ], [ 0.077349, 0.416286 ],
- [ -0.339471, -0.407609 ], [ -0.019384, -0.215111 ], [ 0.168229, -0.032453 ],
- [ -0.040140, 0.399658 ], [ -0.275141, 0.008218 ]
-];
-
-const SIPRO_LSF_CB2_LBR: &[[f32; 2]] = &[
- [ 0.024608, 0.006198 ], [ -0.216616, -0.398169 ], [ -0.089601, -0.201370 ],
- [ -0.121878, -0.305281 ], [ 0.037913, 0.059320 ], [ 0.245126, 0.244089 ],
- [ 0.266853, 0.182476 ], [ 0.319362, 0.203481 ], [ 0.349945, 0.252644 ],
- [ 0.393849, 0.279272 ], [ 0.445707, 0.258063 ], [ 0.387321, 0.200855 ],
- [ -0.038818, 0.129603 ], [ -0.009510, 0.076441 ], [ -0.023892, -0.028199 ],
- [ -0.117134, -0.145990 ], [ -0.186585, -0.052886 ], [ -0.034250, -0.084547 ],
- [ -0.087443, -0.095426 ], [ -0.453322, -0.174493 ], [ -0.363975, -0.148186 ],
- [ -0.334413, -0.202479 ], [ -0.221313, -0.181320 ], [ -0.131146, -0.050611 ],
- [ -0.104706, 0.115139 ], [ 0.192765, 0.275417 ], [ 0.014184, 0.194251 ],
- [ 0.154215, 0.226949 ], [ 0.084031, 0.221759 ], [ 0.189438, 0.164566 ],
- [ 0.130737, 0.170962 ], [ -0.066815, 0.062954 ], [ -0.177176, -0.145167 ],
- [ -0.247608, -0.129767 ], [ -0.187886, -0.293720 ], [ -0.244036, -0.344655 ],
- [ -0.203063, -0.234947 ], [ -0.292715, -0.158421 ], [ 0.064990, -0.028164 ],
- [ 0.147664, 0.085995 ], [ 0.107977, 0.002253 ], [ 0.071286, 0.027533 ],
- [ 0.021017, -0.049807 ], [ -0.272056, -0.217857 ], [ -0.065596, 0.008375 ],
- [ -0.150818, -0.195514 ], [ -0.012767, -0.150787 ], [ 0.238541, 0.136606 ],
- [ 0.291741, 0.114024 ], [ 0.202677, 0.103701 ], [ 0.140985, 0.037759 ],
- [ -0.257347, -0.442383 ], [ -0.320666, -0.319742 ], [ -0.488725, -0.603660 ],
- [ -0.319170, -0.469806 ], [ 0.014970, -0.101074 ], [ 0.102209, 0.066790 ],
- [ -0.076202, -0.044884 ], [ 0.073868, 0.152565 ], [ 0.070755, -0.091358 ],
- [ -0.016751, 0.027216 ], [ 0.071201, 0.096981 ], [ -0.060975, -0.145638 ],
- [ 0.114156, 0.117587 ], [ -0.284757, -0.029101 ], [ -0.253005, -0.073645 ],
- [ -0.204028, -0.098492 ], [ -0.114508, 0.001219 ], [ -0.225284, -0.011998 ],
- [ -0.235670, 0.084330 ], [ 0.161921, 0.128334 ], [ 0.025717, 0.119456 ],
- [ -0.255292, -0.281471 ], [ -0.392803, -0.095809 ], [ 0.039229, -0.152110 ],
- [ -0.310905, -0.099233 ], [ -0.268773, 0.032308 ], [ -0.340150, 0.013129 ],
- [ -0.344890, -0.045157 ], [ -0.188423, 0.265603 ], [ -0.168235, -0.000936 ],
- [ 0.000462, 0.297000 ], [ 0.263674, 0.371214 ], [ -0.146797, -0.098225 ],
- [ -0.386557, -0.282426 ], [ -0.070940, -0.255550 ], [ 0.293258, 0.252785 ],
- [ 0.408332, 0.387751 ], [ -0.381914, -0.358918 ], [ -0.463621, -0.315560 ],
- [ -0.323681, -0.258465 ], [ 0.250055, 0.071195 ], [ -0.405256, -0.429754 ],
- [ -0.135748, -0.251274 ], [ 0.186827, 0.060177 ], [ 0.116742, -0.053526 ],
- [ -0.403321, -0.220339 ], [ -0.414144, -0.021108 ], [ -0.416877, 0.050184 ],
- [ -0.470083, -0.079564 ], [ -0.315554, 0.219217 ], [ -0.273183, 0.138437 ],
- [ 0.253231, 0.306374 ], [ 0.177802, 0.346298 ], [ 0.210358, 0.207697 ],
- [ -0.323480, 0.077519 ], [ -0.193136, 0.048170 ], [ 0.114492, 0.292778 ],
- [ -0.130766, 0.056677 ], [ -0.171572, -0.349267 ], [ -0.370076, -0.536392 ],
- [ -0.311109, -0.389953 ], [ 0.334928, 0.367664 ], [ 0.351246, 0.438664 ],
- [ 0.518803, 0.331253 ], [ 0.437061, 0.327257 ], [ 0.318906, 0.307389 ],
- [ -0.025972, -0.206758 ], [ 0.373278, 0.325438 ], [ 0.473488, 0.389441 ],
- [ 0.478553, 0.477990 ], [ 0.332783, 0.153825 ], [ 0.212098, 0.452336 ],
- [ 0.161522, -0.011212 ], [ 0.209368, 0.020687 ], [ -0.086262, 0.204493 ],
- [ -0.388643, 0.133640 ], [ -0.177016, 0.134404 ]
-];
-
-const SIPRO_LSF_CB3_LBR: &[[f32; 2]] = &[
- [ -0.003594, -0.022447 ], [ 0.070651, 0.028334 ], [ -0.290374, -0.018347 ],
- [ -0.224495, -0.370312 ], [ -0.269555, -0.131227 ], [ -0.122714, -0.267733 ],
- [ 0.173325, 0.138698 ], [ 0.161946, 0.020687 ], [ 0.111706, 0.022510 ],
- [ 0.097638, 0.056049 ], [ 0.139754, 0.059920 ], [ 0.056549, -0.050586 ],
- [ 0.036301, 0.021501 ], [ -0.066347, 0.012324 ], [ -0.066972, 0.096136 ],
- [ -0.120062, -0.084201 ], [ 0.011225, 0.047425 ], [ -0.012846, -0.067390 ],
- [ -0.116201, 0.122874 ], [ -0.027819, 0.035453 ], [ -0.024743, 0.072835 ],
- [ -0.034061, -0.001310 ], [ 0.077469, 0.081609 ], [ 0.128347, 0.139584 ],
- [ 0.183416, 0.086563 ], [ -0.155839, -0.053775 ], [ -0.190403, -0.018639 ],
- [ -0.202548, -0.062841 ], [ -0.373733, -0.275094 ], [ -0.394260, -0.186513 ],
- [ -0.465700, -0.220031 ], [ 0.064400, -0.095825 ], [ -0.262053, -0.199837 ],
- [ -0.167233, -0.094402 ], [ 0.048600, 0.057567 ], [ -0.007122, 0.168506 ],
- [ 0.050938, 0.156451 ], [ -0.060828, 0.147083 ], [ -0.171889, 0.195822 ],
- [ -0.218934, 0.138431 ], [ -0.270532, 0.195775 ], [ -0.405818, 0.075643 ],
- [ -0.440187, 0.193387 ], [ -0.484968, 0.157607 ], [ -0.480560, 0.067230 ],
- [ -0.436757, -0.111847 ], [ -0.040731, -0.040363 ], [ -0.202319, -0.170457 ],
- [ -0.158515, -0.134551 ], [ -0.356709, -0.378549 ], [ -0.268820, -0.289831 ],
- [ -0.188486, -0.289306 ], [ -0.148139, -0.177616 ], [ -0.071591, -0.191128 ],
- [ -0.052270, -0.150589 ], [ -0.020543, -0.116220 ], [ 0.039584, -0.012592 ],
- [ -0.268226, 0.042704 ], [ -0.209755, 0.069423 ], [ -0.168964, 0.124504 ],
- [ -0.363240, 0.188266 ], [ -0.524935, -0.025010 ], [ -0.105894, -0.002699 ],
- [ -0.251830, -0.062018 ], [ -0.310480, -0.082325 ], [ 0.014652, 0.083127 ],
- [ -0.136512, 0.033116 ], [ -0.073755, -0.025236 ], [ 0.110766, 0.095954 ],
- [ 0.002878, 0.011838 ], [ -0.074977, -0.244586 ], [ -0.047023, -0.081339 ],
- [ -0.183249, 0.029525 ], [ 0.263435, 0.206934 ], [ -0.156721, -0.229993 ],
- [ -0.112224, -0.208941 ], [ -0.116534, -0.123191 ], [ -0.073988, -0.111668 ],
- [ 0.029484, -0.137573 ], [ -0.009802, -0.161685 ], [ -0.023273, 0.114043 ],
- [ -0.332651, 0.049072 ], [ -0.394009, 0.018608 ], [ -0.433543, -0.035318 ],
- [ -0.368459, -0.108024 ], [ -0.350215, -0.037617 ], [ -0.321140, -0.178537 ],
- [ 0.020307, -0.048487 ], [ -0.210512, -0.232274 ], [ -0.082140, -0.065443 ],
- [ 0.081961, -0.009340 ], [ 0.146794, 0.101973 ], [ 0.213999, 0.124687 ],
- [ 0.100217, -0.054095 ], [ -0.114411, -0.041403 ], [ -0.097631, 0.037061 ],
- [ -0.099651, -0.157978 ], [ -0.215790, -0.116550 ], [ -0.107100, 0.076300 ],
- [ 0.084653, 0.126088 ], [ 0.246439, 0.091442 ], [ 0.160077, 0.188536 ],
- [ 0.273900, 0.279190 ], [ 0.320417, 0.232550 ], [ 0.132710, -0.018988 ],
- [ 0.018950, -0.091681 ], [ -0.032073, -0.202906 ], [ 0.212789, 0.178188 ],
- [ 0.208580, 0.239726 ], [ 0.049420, 0.099840 ], [ -0.145695, -0.010619 ],
- [ -0.132525, -0.322660 ], [ 0.019666, 0.126603 ], [ 0.260809, 0.147727 ],
- [ -0.232795, -0.001090 ], [ -0.049826, 0.225987 ], [ -0.154774, 0.076614 ],
- [ 0.045032, 0.221397 ], [ 0.321014, 0.161632 ], [ -0.062379, 0.053586 ],
- [ 0.132252, 0.246675 ], [ 0.392627, 0.271905 ], [ -0.264585, 0.102344 ],
- [ -0.327200, 0.121624 ], [ -0.399642, 0.124445 ], [ -0.108335, 0.179171 ],
- [ 0.100374, 0.182731 ], [ 0.203852, 0.049505 ]
-];
-
-const SIPRO_LSF_CB4_LBR: &[[f32; 2]] = &[
- [ -0.047705, 0.008002 ], [ 0.011332, 0.065028 ], [ -0.021796, -0.034777 ],
- [ -0.147394, -0.001241 ], [ -0.001577, 0.020599 ], [ -0.083827, -0.028975 ],
- [ -0.177707, 0.066046 ], [ -0.043241, -0.165144 ], [ 0.053322, 0.096519 ],
- [ -0.097688, 0.106484 ], [ -0.023392, 0.111234 ], [ -0.146747, -0.159360 ],
- [ 0.027241, -0.011806 ], [ -0.043156, 0.057667 ], [ 0.019516, -0.062116 ],
- [ 0.025990, 0.162533 ], [ 0.091888, 0.009720 ], [ -0.098511, 0.036414 ],
- [ 0.013722, -0.116512 ], [ 0.054833, -0.180975 ], [ 0.119497, 0.128774 ],
- [ 0.118378, -0.125997 ], [ 0.065882, -0.030932 ], [ 0.120581, -0.039964 ],
- [ -0.050561, -0.088577 ], [ 0.050134, 0.033194 ], [ -0.129654, -0.075112 ],
- [ -0.225334, -0.040234 ], [ 0.070629, -0.084455 ], [ 0.095508, 0.063548 ],
- [ 0.150514, 0.034366 ], [ 0.186092, -0.069272 ]
-];
-
-const SIPRO_MEAN_LSF_LBR: [f32; 10] = [
- 0.297151, 0.452308, 0.765443, 1.134803, 1.421125,
- 1.773822, 2.049173, 2.375914, 2.585097, 0.075756
-];
-
-const SIPRO_LSF_CODEBOOK_16K: [&[[f32; 3]]; 4] = [
- SIPRO_LSF_CB0_16K, SIPRO_LSF_CB1_16K, SIPRO_LSF_CB2_16K, SIPRO_LSF_CB3_16K
-];
-
-const SIPRO_LSF_CB0_16K: &[[f32; 3]] = &[
- [ -0.089990, -0.172485, -0.203391 ], [ -0.094710, -0.178687, -0.134483 ],
- [ -0.056398, -0.131952, -0.154500 ], [ -0.051362, -0.128138, -0.198549 ],
- [ -0.061700, -0.142830, -0.251623 ], [ -0.041512, -0.115637, -0.229420 ],
- [ -0.036544, -0.107512, -0.173125 ], [ -0.024158, -0.088450, -0.204144 ],
- [ -0.038690, -0.103368, -0.132674 ], [ -0.056954, -0.128472, -0.104669 ],
- [ -0.020963, -0.076785, -0.163199 ], [ -0.012952, -0.077249, -0.128385 ],
- [ -0.032787, -0.097044, -0.093967 ], [ -0.035214, -0.053838, -0.111940 ],
- [ -0.013850, -0.036926, -0.139328 ], [ -0.004956, -0.065092, -0.087709 ],
- [ -0.065354, -0.065595, -0.079064 ], [ -0.023627, -0.081457, -0.054195 ],
- [ -0.027335, -0.035244, -0.068034 ], [ 0.016555, -0.047075, -0.128286 ],
- [ 0.021066, -0.037252, -0.092041 ], [ 0.014681, -0.043044, -0.057739 ],
- [ -0.008493, -0.008143, -0.102486 ], [ -0.002303, -0.061540, -0.022952 ],
- [ -0.006061, -0.014278, -0.033652 ], [ -0.005276, 0.011246, -0.062762 ],
- [ 0.043411, -0.006303, -0.063730 ], [ 0.035885, -0.010052, -0.115290 ],
- [ 0.030628, -0.031538, -0.017807 ], [ 0.022345, 0.028210, -0.032335 ],
- [ 0.026535, 0.027536, -0.091150 ], [ -0.003365, -0.008077, 0.015687 ],
- [ -0.026013, 0.017493, -0.010355 ], [ 0.059069, 0.010634, -0.007530 ],
- [ 0.044038, -0.019424, 0.030453 ], [ -0.036065, -0.034215, -0.007758 ],
- [ 0.022486, 0.042543, 0.027870 ], [ -0.049985, -0.016085, 0.021768 ],
- [ -0.021715, 0.021168, 0.052076 ], [ -0.004243, -0.061228, 0.027640 ],
- [ -0.033950, -0.017287, 0.064656 ], [ 0.016151, 0.000727, 0.062757 ],
- [ -0.063456, -0.043152, 0.056707 ], [ -0.067715, 0.006126, 0.058178 ],
- [ -0.038931, 0.051673, 0.030636 ], [ -0.073017, -0.074716, 0.026387 ],
- [ -0.039893, -0.104629, 0.039616 ], [ -0.073179, -0.074601, 0.082069 ],
- [ -0.066154, -0.027180, 0.099439 ], [ -0.075167, -0.121149, 0.071938 ],
- [ -0.030382, -0.092582, 0.091067 ], [ -0.084519, -0.137542, 0.023626 ],
- [ -0.060956, -0.121259, -0.015264 ], [ -0.030069, -0.093823, -0.008692 ],
- [ -0.063564, -0.065225, -0.025820 ], [ -0.052074, -0.117595, -0.059689 ],
- [ -0.091652, -0.165173, -0.045573 ], [ -0.070167, -0.121342, 0.131707 ],
- [ -0.061024, -0.005833, -0.051035 ], [ 0.007837, -0.051816, 0.074575 ],
- [ -0.070643, -0.053927, 0.149498 ], [ -0.014358, -0.066681, 0.139708 ],
- [ -0.058186, 0.029576, 0.092923 ], [ -0.023371, 0.007058, 0.112484 ],
- [ -0.057969, 0.022786, 0.148420 ], [ 0.029439, -0.017673, 0.121423 ],
- [ -0.015811, 0.056785, 0.091594 ], [ 0.004347, 0.056680, 0.137848 ],
- [ -0.004464, 0.002342, 0.184013 ], [ 0.029660, 0.046870, 0.082654 ],
- [ 0.059408, 0.001016, 0.086063 ], [ 0.055263, 0.027574, 0.155037 ],
- [ 0.062166, 0.064323, 0.117371 ], [ 0.022967, 0.100050, 0.077227 ],
- [ 0.041795, 0.096343, 0.170421 ], [ 0.053189, 0.122931, 0.118549 ],
- [ 0.094247, 0.094448, 0.078395 ], [ 0.082407, 0.033408, 0.041085 ],
- [ 0.096820, 0.115960, 0.149433 ], [ 0.067804, 0.121849, 0.025336 ],
- [ -0.008421, 0.104316, 0.032314 ], [ 0.031013, 0.073218, -0.004899 ],
- [ 0.085079, 0.060323, -0.009687 ], [ 0.028174, 0.092766, -0.055590 ],
- [ 0.070133, 0.039160, -0.061035 ], [ -0.039211, 0.072517, -0.028756 ],
- [ 0.129686, 0.100233, -0.046998 ], [ 0.154189, 0.107616, 0.022791 ],
- [ -0.049331, 0.094184, 0.087984 ], [ -0.013179, 0.126552, 0.125099 ],
- [ -0.058716, 0.098524, 0.150886 ], [ -0.022753, 0.080011, 0.191127 ],
- [ 0.013451, 0.164593, 0.153768 ], [ 0.074818, 0.181214, 0.108211 ],
- [ 0.091323, 0.169249, 0.168460 ], [ 0.033885, 0.155516, 0.213745 ],
- [ -0.032128, 0.227238, 0.135815 ], [ -0.059176, 0.168980, 0.229110 ],
- [ 0.033917, 0.229753, 0.222264 ], [ 0.082702, 0.116370, 0.224697 ],
- [ 0.127737, 0.186658, 0.212783 ], [ 0.047528, 0.063920, 0.216856 ],
- [ -0.002446, 0.114174, 0.263289 ], [ -0.077783, 0.082523, 0.249697 ],
- [ 0.010023, 0.024267, 0.256874 ], [ 0.053190, 0.111422, 0.310407 ],
- [ -0.078804, 0.004444, 0.224078 ], [ -0.055253, -0.059180, 0.217892 ],
- [ -0.065371, 0.008124, 0.333405 ], [ -0.076188, -0.098767, 0.286983 ],
- [ -0.071911, -0.115804, 0.198031 ], [ -0.062473, 0.183639, 0.370162 ],
- [ -0.042666, 0.255210, 0.262720 ], [ 0.011999, 0.217530, 0.318291 ],
- [ -0.042144, 0.322087, 0.326387 ], [ 0.090663, 0.205835, 0.294784 ],
- [ 0.058218, 0.293649, 0.277927 ], [ 0.157506, 0.282870, 0.294610 ],
- [ 0.118248, 0.261007, 0.148614 ], [ 0.065261, 0.332362, 0.411912 ],
- [ 0.141269, 0.451850, 0.315726 ], [ 0.001706, 0.456301, 0.357590 ],
- [ -0.052947, 0.356559, 0.456944 ], [ 0.247707, 0.263837, 0.152591 ],
- [ 0.306847, 0.417373, 0.258553 ], [ 0.166347, 0.149222, 0.118973 ],
- [ 0.379709, 0.292172, 0.139875 ], [ 0.010171, -0.055170, -0.174523 ]
-];
-
-const SIPRO_LSF_CB1_16K: &[[f32; 3]] = &[
- [ -0.213011, -0.293385, -0.330597 ], [ -0.212582, -0.240992, -0.338239 ],
- [ -0.223373, -0.306214, -0.277192 ], [ -0.231138, -0.287729, -0.229412 ],
- [ -0.238466, -0.228571, -0.260954 ], [ -0.140931, -0.247018, -0.258566 ],
- [ -0.136239, -0.249669, -0.350143 ], [ -0.149738, -0.192970, -0.281475 ],
- [ -0.167058, -0.261052, -0.196301 ], [ -0.177049, -0.201324, -0.207897 ],
- [ -0.116915, -0.200629, -0.212526 ], [ -0.162247, -0.143805, -0.245093 ],
- [ -0.082042, -0.191842, -0.266338 ], [ -0.098846, -0.208511, -0.320481 ],
- [ -0.113510, -0.152470, -0.222474 ], [ -0.066197, -0.179112, -0.207813 ],
- [ -0.129490, -0.169320, -0.155238 ], [ -0.078843, -0.190292, -0.155172 ],
- [ -0.087790, -0.147729, -0.169351 ], [ -0.141037, -0.127207, -0.177910 ],
- [ -0.126525, -0.223961, -0.153639 ], [ -0.101464, -0.189953, -0.114559 ],
- [ -0.102450, -0.106303, -0.151171 ], [ -0.103208, -0.144457, -0.105378 ],
- [ -0.170794, -0.140525, -0.136428 ], [ -0.168641, -0.203064, -0.135368 ],
- [ -0.138193, -0.116042, -0.111905 ], [ -0.145085, -0.168581, -0.092613 ],
- [ -0.126379, -0.220431, -0.091327 ], [ -0.212934, -0.184797, -0.101632 ],
- [ -0.193711, -0.140556, -0.078304 ], [ -0.173674, -0.197276, -0.060140 ],
- [ -0.197897, -0.241907, -0.091997 ], [ -0.156037, -0.258519, -0.111628 ],
- [ -0.241964, -0.191124, -0.063140 ], [ -0.261340, -0.240847, -0.103132 ],
- [ -0.221621, -0.242972, -0.041255 ], [ -0.224166, -0.232742, -0.161568 ],
- [ -0.203591, -0.294470, -0.126035 ], [ -0.209540, -0.303149, -0.053170 ],
- [ -0.253859, -0.295066, -0.156050 ], [ -0.278143, -0.331105, -0.085237 ],
- [ -0.300273, -0.198750, -0.094834 ], [ -0.260477, -0.169713, -0.132476 ],
- [ -0.211889, -0.172454, -0.164281 ], [ -0.228370, -0.122149, -0.124178 ],
- [ -0.254629, -0.135668, -0.081692 ], [ -0.263813, -0.154928, -0.213596 ],
- [ -0.308224, -0.106877, -0.084404 ], [ -0.242644, -0.082862, -0.085835 ],
- [ -0.252084, -0.064888, -0.146498 ], [ -0.198162, -0.105721, -0.188887 ],
- [ -0.189238, -0.088028, -0.109736 ], [ -0.197598, -0.099831, -0.044030 ],
- [ -0.269017, -0.105991, -0.021513 ], [ -0.231349, -0.058825, -0.041407 ],
- [ -0.225589, -0.027501, -0.087160 ], [ -0.160347, -0.058341, -0.079789 ],
- [ -0.158729, -0.108951, -0.067262 ], [ -0.170483, -0.053023, -0.017561 ],
- [ -0.175207, -0.013649, -0.049513 ], [ -0.156004, -0.108378, -0.004052 ],
- [ -0.219958, -0.082362, 0.014950 ], [ -0.217785, -0.012981, -0.009410 ],
- [ -0.123290, -0.040849, -0.040910 ], [ -0.119861, -0.095078, -0.060246 ],
- [ -0.117537, -0.065479, 0.002968 ], [ -0.103231, -0.113298, -0.023282 ],
- [ -0.136365, -0.149524, -0.051387 ], [ -0.119332, -0.164400, -0.009103 ],
- [ -0.104522, -0.060948, -0.083056 ], [ -0.071461, -0.070787, -0.037347 ],
- [ -0.081116, -0.149015, -0.056740 ], [ -0.069561, -0.108099, -0.069167 ],
- [ -0.055624, -0.117369, -0.025091 ], [ -0.091941, -0.190091, -0.060020 ],
- [ -0.072003, -0.168433, -0.006540 ], [ -0.033305, -0.154427, -0.054608 ],
- [ -0.062988, -0.127093, -0.108307 ], [ -0.056690, -0.170813, -0.102834 ],
- [ -0.018273, -0.127863, -0.094998 ], [ -0.056239, -0.123678, -0.146262 ],
- [ -0.023442, -0.154617, -0.137417 ], [ -0.051903, -0.078379, -0.093395 ],
- [ -0.014599, -0.104412, -0.135959 ], [ -0.051582, -0.081280, -0.140643 ],
- [ -0.092727, -0.091930, -0.107816 ], [ -0.024814, -0.140993, -0.183243 ],
- [ -0.064307, -0.113024, -0.194788 ], [ -0.000118, -0.098858, -0.195336 ],
- [ -0.028090, -0.048258, -0.164101 ], [ -0.093414, -0.055969, -0.172743 ],
- [ -0.114445, -0.104336, -0.215204 ], [ -0.048518, -0.132063, -0.242991 ],
- [ -0.159620, -0.060240, -0.178592 ], [ -0.135728, -0.067473, -0.131876 ],
- [ -0.078464, -0.038040, -0.125105 ], [ -0.011061, -0.064011, -0.102496 ],
- [ -0.033887, -0.026485, -0.109493 ], [ -0.129128, -0.014216, -0.111329 ],
- [ -0.190687, -0.030660, -0.135825 ], [ -0.082037, 0.010997, -0.100167 ],
- [ -0.183403, 0.001651, -0.098962 ], [ -0.074775, -0.030335, -0.062217 ],
- [ -0.031759, -0.050551, -0.059420 ], [ -0.051439, 0.010827, -0.052148 ],
- [ -0.126744, 0.008689, -0.047785 ], [ -0.145916, 0.042019, -0.077431 ],
- [ -0.093552, 0.054143, -0.060473 ], [ -0.090660, 0.012868, -0.018195 ],
- [ -0.079783, -0.033071, 0.001482 ], [ -0.033010, -0.022331, -0.014506 ],
- [ -0.004798, -0.017339, -0.060120 ], [ -0.025021, 0.026390, -0.003263 ],
- [ -0.001437, 0.025994, -0.040892 ], [ -0.074821, 0.019005, 0.027549 ],
- [ -0.030811, -0.012114, 0.034284 ], [ 0.006785, 0.004618, 0.018717 ],
- [ 0.013392, -0.032597, -0.023731 ], [ 0.035994, 0.005963, -0.011757 ],
- [ 0.008071, -0.045750, 0.024889 ], [ 0.013055, 0.017040, 0.054121 ],
- [ -0.012989, 0.044864, 0.036327 ], [ 0.025054, 0.047137, 0.009974 ],
- [ 0.053801, 0.024178, 0.031774 ], [ 0.056442, -0.030647, 0.021291 ],
- [ 0.032247, 0.052680, 0.049886 ], [ 0.035369, 0.090207, 0.031394 ],
- [ 0.064720, 0.070390, 0.040938 ], [ 0.022112, 0.054834, 0.091059 ],
- [ 0.041765, 0.086248, 0.070196 ], [ 0.070645, 0.060852, 0.078825 ],
- [ 0.058506, 0.016920, 0.081612 ], [ 0.000009, 0.086500, 0.059849 ],
- [ 0.071253, 0.107392, 0.059046 ], [ 0.094702, 0.096160, 0.090982 ],
- [ 0.047639, 0.110877, 0.111227 ], [ 0.122444, 0.090909, 0.057396 ],
- [ 0.101916, 0.052299, 0.029909 ], [ 0.076560, 0.086094, -0.007252 ],
- [ 0.123411, 0.030769, 0.082749 ], [ 0.135579, 0.103022, 0.009540 ],
- [ 0.120576, 0.065284, -0.024095 ], [ 0.077483, 0.028526, -0.012369 ],
- [ 0.128747, 0.017901, -0.003874 ], [ 0.158254, 0.046962, 0.029577 ],
- [ 0.102287, -0.002211, 0.037329 ], [ 0.089654, -0.021372, -0.006857 ],
- [ 0.137917, 0.027228, -0.053223 ], [ 0.098728, -0.012192, -0.048518 ],
- [ 0.083974, 0.036153, -0.062266 ], [ 0.048230, -0.010241, -0.052293 ],
- [ 0.110135, 0.007715, -0.095233 ], [ 0.068294, -0.014317, -0.104029 ],
- [ 0.063909, -0.056416, -0.063023 ], [ 0.059133, -0.044675, -0.023780 ],
- [ 0.030748, 0.021845, -0.086332 ], [ 0.023994, -0.045574, -0.076232 ],
- [ 0.052147, -0.059825, -0.109667 ], [ 0.013087, -0.020420, -0.121945 ],
- [ 0.018163, -0.096765, -0.088758 ], [ 0.020196, -0.076470, -0.048112 ],
- [ 0.020282, -0.084204, -0.135535 ], [ 0.040076, -0.053464, -0.161949 ],
- [ -0.017796, -0.103070, -0.059559 ], [ -0.016484, -0.070138, -0.016866 ],
- [ 0.004849, -0.112481, -0.017731 ], [ 0.040160, -0.073873, -0.005327 ],
- [ 0.002202, -0.094723, 0.045366 ], [ -0.056918, -0.081578, 0.017875 ],
- [ -0.031099, -0.141708, 0.009186 ], [ -0.102802, -0.122675, 0.030060 ],
- [ -0.061717, -0.145116, 0.076680 ], [ -0.073607, -0.050464, 0.072853 ],
- [ -0.117403, -0.194921, 0.040101 ], [ -0.185236, -0.133620, 0.045939 ],
- [ -0.160174, -0.057226, 0.056641 ], [ -0.178489, -0.173435, -0.007806 ],
- [ -0.199916, -0.204866, 0.047342 ], [ -0.152337, -0.249651, 0.034656 ],
- [ -0.185637, -0.230942, -0.002072 ], [ -0.122548, -0.215209, -0.024552 ],
- [ -0.249578, -0.209714, 0.009470 ], [ -0.160108, -0.257702, -0.040992 ],
- [ -0.216694, -0.289353, 0.027182 ], [ -0.226390, -0.147844, -0.022742 ],
- [ -0.288737, -0.272150, -0.013948 ], [ -0.262554, -0.237035, 0.072473 ],
- [ -0.306267, -0.188335, -0.032894 ], [ -0.259666, -0.345816, 0.024138 ],
- [ -0.271093, -0.137143, 0.040404 ], [ -0.201317, -0.286782, 0.107615 ],
- [ -0.235725, -0.163396, 0.113844 ], [ -0.159988, -0.209788, 0.112140 ],
- [ -0.262985, -0.056741, 0.093506 ], [ -0.277226, -0.037306, 0.016008 ],
- [ -0.293486, -0.040422, -0.062018 ], [ -0.214921, 0.022900, 0.055295 ],
- [ -0.253889, 0.058575, -0.000151 ], [ -0.246689, 0.024242, -0.058488 ],
- [ -0.143790, 0.006767, 0.014061 ], [ -0.187077, 0.048882, -0.035625 ],
- [ -0.196369, 0.112085, 0.031546 ], [ -0.124264, 0.086197, -0.020800 ],
- [ -0.126249, 0.016960, 0.095741 ], [ -0.079816, 0.080398, 0.051038 ],
- [ -0.056269, 0.075380, -0.028262 ], [ -0.120493, 0.148495, 0.028430 ],
- [ -0.161750, 0.101290, 0.117806 ], [ -0.003247, 0.083393, -0.017061 ],
- [ -0.034007, 0.142542, 0.007402 ], [ -0.037618, 0.025871, 0.089496 ],
- [ -0.082819, 0.184435, 0.073224 ], [ 0.006448, 0.167015, 0.080548 ],
- [ 0.035315, 0.144022, 0.003218 ], [ -0.023459, 0.088147, 0.152604 ],
- [ 0.006247, -0.024099, 0.077792 ], [ 0.039894, 0.057586, -0.042455 ],
- [ -0.020417, 0.035400, -0.093971 ], [ 0.075465, 0.052063, 0.145582 ],
- [ 0.078027, 0.184720, 0.092096 ], [ 0.107295, 0.148380, 0.022264 ],
- [ 0.066928, -0.052831, 0.065108 ], [ 0.093295, 0.118157, 0.149815 ],
- [ 0.119373, 0.137114, 0.099536 ], [ 0.138653, 0.075509, 0.121545 ],
- [ 0.174025, 0.077531, 0.077169 ], [ 0.165839, 0.150080, 0.133423 ],
- [ 0.173276, 0.155887, 0.048150 ], [ 0.162910, 0.095898, 0.171896 ],
- [ 0.214577, 0.112888, 0.115579 ], [ 0.204755, 0.106392, 0.032337 ],
- [ 0.178853, 0.205034, 0.114760 ], [ 0.177401, 0.070504, -0.013778 ],
- [ 0.241624, 0.166921, 0.066087 ], [ 0.219595, 0.183553, 0.172332 ],
- [ 0.123671, 0.170842, 0.167216 ], [ 0.177104, 0.240197, 0.186359 ],
- [ 0.272003, 0.220214, 0.126073 ], [ 0.093748, 0.235843, 0.160998 ],
- [ 0.141510, 0.190012, 0.240416 ], [ 0.046878, 0.168984, 0.190412 ],
- [ 0.094898, 0.107038, 0.235003 ], [ 0.108592, 0.269536, 0.262528 ],
- [ -0.027754, 0.234355, 0.134544 ], [ 0.265127, 0.267540, 0.199041 ],
- [ 0.199523, 0.291507, 0.265171 ], [ 0.266177, 0.209339, 0.350369 ],
- [ 0.322159, 0.344794, 0.270823 ], [ 0.399957, 0.264065, 0.110387 ],
- [ 0.277817, 0.127407, -0.035625 ], [ -0.177038, 0.208155, 0.119077 ],
- [ 0.049075, -0.076294, 0.145711 ], [ 0.187246, 0.042865, -0.127097 ],
- [ 0.117885, -0.023489, -0.138658 ], [ -0.284256, 0.068153, 0.124259 ]
-];
-
-const SIPRO_LSF_CB2_16K: &[[f32; 3]] = &[
- [ -0.223412, -0.236300, -0.188067 ], [ -0.202286, -0.218711, -0.102947 ],
- [ -0.251652, -0.161020, -0.125280 ], [ -0.169223, -0.138155, -0.140430 ],
- [ -0.176427, -0.146628, -0.222632 ], [ -0.120584, -0.187276, -0.180164 ],
- [ -0.195559, -0.074225, -0.169109 ], [ -0.144551, -0.142774, -0.073340 ],
- [ -0.111001, -0.111310, -0.130696 ], [ -0.095221, -0.174684, -0.111841 ],
- [ -0.112158, -0.103049, -0.195130 ], [ -0.059989, -0.142170, -0.157850 ],
- [ -0.127598, -0.051759, -0.153109 ], [ -0.063753, -0.067898, -0.164117 ],
- [ -0.141753, -0.068274, -0.091999 ], [ -0.060482, -0.101054, -0.099475 ],
- [ -0.104699, -0.104456, -0.066496 ], [ -0.073649, -0.052614, -0.091612 ],
- [ -0.088268, -0.019072, -0.129956 ], [ -0.018837, -0.104115, -0.127837 ],
- [ -0.021630, -0.033055, -0.129868 ], [ -0.083768, -0.047549, -0.041407 ],
- [ -0.055892, -0.108526, -0.043200 ], [ -0.027816, -0.062499, -0.048190 ],
- [ -0.002248, -0.110428, -0.062868 ], [ 0.001270, -0.033245, -0.072404 ],
- [ -0.042747, -0.013835, -0.033829 ], [ -0.037615, -0.147833, -0.083912 ],
- [ -0.045023, 0.006011, -0.092182 ], [ -0.050411, -0.081832, 0.005787 ],
- [ 0.000357, -0.104282, -0.009428 ], [ -0.003893, -0.047892, -0.001506 ],
- [ -0.040077, -0.147110, -0.009065 ], [ -0.060858, -0.030972, 0.012999 ],
- [ -0.014674, 0.001370, 0.005554 ], [ -0.101362, -0.126061, -0.001898 ],
- [ -0.102519, -0.000390, -0.015721 ], [ -0.132687, -0.069608, -0.019928 ],
- [ -0.102227, -0.076131, 0.043306 ], [ -0.055193, 0.027001, 0.011857 ],
- [ -0.156427, -0.016629, 0.017480 ], [ -0.078736, 0.002809, 0.057979 ],
- [ -0.157789, -0.016693, -0.055073 ], [ -0.179397, -0.095520, 0.022065 ],
- [ -0.110219, 0.010408, -0.081927 ], [ -0.125392, 0.049111, 0.044595 ],
- [ -0.112528, 0.063173, -0.024954 ], [ -0.185525, 0.053093, -0.032102 ],
- [ -0.176887, -0.019379, -0.115125 ], [ -0.249706, -0.017664, -0.059188 ],
- [ -0.200243, -0.103311, -0.066846 ], [ -0.055404, 0.045106, -0.046991 ],
- [ -0.000544, 0.022690, -0.044831 ], [ 0.022298, -0.016367, -0.022509 ],
- [ 0.028278, 0.017585, -0.100612 ], [ 0.061781, -0.020826, -0.068190 ],
- [ 0.029157, -0.074477, -0.098898 ], [ 0.043073, -0.067234, -0.032293 ],
- [ 0.060157, 0.034636, -0.034885 ], [ 0.071153, -0.013881, -0.009036 ],
- [ 0.054196, -0.029989, -0.131139 ], [ 0.030193, 0.024976, 0.009861 ],
- [ 0.055943, -0.045304, 0.031927 ], [ 0.033217, -0.002418, 0.038165 ],
- [ 0.063814, 0.045625, 0.025309 ], [ 0.033689, 0.038819, 0.049700 ],
- [ 0.073582, 0.028527, 0.060200 ], [ -0.007957, 0.022531, 0.043687 ],
- [ -0.000984, 0.054518, 0.018742 ], [ 0.057004, 0.060916, 0.060573 ],
- [ 0.009883, 0.015238, 0.080211 ], [ 0.022742, 0.070832, 0.068855 ],
- [ 0.053001, 0.029790, 0.091446 ], [ -0.042447, 0.060379, 0.061462 ],
- [ 0.076826, 0.062468, 0.089653 ], [ 0.039065, 0.069768, 0.119128 ],
- [ 0.064145, 0.095353, 0.071621 ], [ 0.094411, 0.069527, 0.054197 ],
- [ 0.042812, 0.093060, 0.027980 ], [ 0.094791, 0.099189, 0.101112 ],
- [ 0.117611, 0.048601, 0.093111 ], [ 0.119951, 0.122758, 0.051546 ],
- [ 0.103558, 0.085245, -0.010700 ], [ 0.150126, 0.059766, 0.020280 ],
- [ 0.108066, 0.017170, 0.008606 ], [ 0.108422, 0.023253, -0.063942 ],
- [ 0.019652, 0.072284, -0.030331 ], [ 0.192719, 0.075624, 0.071156 ],
- [ 0.221140, 0.069191, -0.035085 ], [ 0.188367, 0.126200, 0.035225 ],
- [ 0.185760, 0.043537, -0.101714 ], [ -0.042518, 0.099646, 0.003244 ],
- [ -0.015308, -0.027521, 0.046006 ], [ 0.034086, -0.045777, 0.095989 ],
- [ 0.007174, -0.093358, 0.046459 ], [ -0.051248, -0.062095, 0.083161 ],
- [ -0.045626, -0.133301, 0.052997 ], [ -0.037840, 0.024042, 0.131097 ],
- [ -0.020217, -0.115942, 0.126170 ], [ -0.134550, -0.036291, 0.111322 ],
- [ -0.110576, -0.160024, 0.091841 ], [ -0.093308, -0.184958, 0.013939 ],
- [ -0.082735, -0.167417, -0.051725 ], [ -0.169934, -0.173003, -0.007155 ],
- [ -0.128244, -0.213123, -0.053337 ], [ -0.079852, -0.154116, -0.246546 ],
- [ -0.032242, -0.108756, -0.204133 ], [ -0.140117, -0.199495, -0.284505 ],
- [ 0.010842, -0.074979, -0.166333 ], [ -0.093313, 0.145006, 0.034110 ],
- [ -0.039236, 0.113213, 0.111053 ], [ 0.040613, -0.031783, 0.174058 ],
- [ -0.164232, 0.131421, 0.149842 ], [ 0.026893, 0.107281, 0.179297 ],
- [ 0.047086, 0.158606, 0.103267 ], [ -0.070567, 0.210459, 0.134734 ],
- [ 0.094392, 0.137050, 0.166892 ], [ 0.086039, 0.063657, 0.168825 ],
- [ 0.159371, 0.120897, 0.154357 ], [ 0.147101, 0.160684, 0.114882 ],
- [ 0.120158, 0.199650, 0.180948 ], [ 0.191417, 0.174500, 0.170734 ],
- [ 0.159153, 0.142165, 0.233347 ], [ 0.232002, 0.150181, 0.102736 ],
- [ 0.188299, 0.221738, 0.228748 ], [ 0.256786, 0.209685, 0.161534 ],
- [ 0.257861, 0.247793, 0.250516 ], [ -0.164461, -0.000143, 0.232461 ]
-];
-
-const SIPRO_LSF_CB3_16K: &[[f32; 3]] = &[
- [ -0.193369, -0.304643, -0.253777 ], [ -0.164125, -0.277786, -0.153116 ],
- [ -0.135681, -0.209120, -0.211724 ], [ -0.121822, -0.215734, -0.292207 ],
- [ -0.198781, -0.161674, -0.242538 ], [ -0.164147, -0.180570, -0.138070 ],
- [ -0.095915, -0.198695, -0.154309 ], [ -0.248386, -0.234462, -0.136984 ],
- [ -0.164968, -0.108318, -0.175635 ], [ -0.124171, -0.111809, -0.224402 ],
- [ -0.067398, -0.157017, -0.195759 ], [ -0.090132, -0.119174, -0.165253 ],
- [ -0.099460, -0.146895, -0.106799 ], [ -0.141493, -0.108103, -0.108880 ],
- [ -0.085088, -0.098340, -0.109953 ], [ -0.105526, -0.054463, -0.154315 ],
- [ -0.040480, -0.144285, -0.124042 ], [ -0.040969, -0.084039, -0.142880 ],
- [ -0.049082, -0.118553, -0.066686 ], [ -0.096336, -0.087515, -0.055741 ],
- [ -0.058605, -0.059327, -0.089275 ], [ -0.121842, -0.058681, -0.086949 ],
- [ -0.053792, -0.022025, -0.124451 ], [ -0.036744, -0.068891, -0.045865 ],
- [ 0.003900, -0.098237, -0.091158 ], [ -0.001664, -0.045089, -0.081353 ],
- [ -0.072829, -0.034087, -0.038416 ], [ -0.100822, -0.007330, -0.088715 ],
- [ -0.035911, -0.005864, -0.062577 ], [ -0.020205, -0.026547, -0.019634 ],
- [ 0.004291, -0.041290, -0.138181 ], [ 0.023404, -0.010932, -0.044904 ],
- [ 0.013557, 0.014823, -0.092943 ], [ 0.059673, -0.031024, -0.095739 ],
- [ 0.021130, -0.080607, -0.034594 ], [ 0.024655, -0.035564, 0.003243 ],
- [ 0.017106, 0.006952, -0.000308 ], [ 0.075208, -0.030910, -0.031181 ],
- [ 0.024965, 0.048632, -0.039448 ], [ 0.057028, 0.021547, -0.009418 ],
- [ -0.018577, 0.023697, -0.009759 ], [ 0.024077, 0.033053, 0.024324 ],
- [ 0.037052, -0.003436, 0.044530 ], [ -0.012871, -0.007179, 0.031795 ],
- [ 0.077877, 0.021547, 0.023131 ], [ 0.053365, 0.052078, 0.029433 ],
- [ 0.011429, 0.070426, 0.028734 ], [ -0.001827, 0.033115, 0.061505 ],
- [ -0.044870, 0.038568, 0.026239 ], [ 0.061633, 0.034799, 0.059784 ],
- [ 0.034261, 0.060342, 0.065185 ], [ 0.058981, 0.082481, 0.047252 ],
- [ 0.090008, 0.065942, 0.044470 ], [ 0.066961, 0.073728, -0.000428 ],
- [ 0.074763, 0.060293, 0.085632 ], [ 0.066366, 0.103375, 0.079642 ],
- [ 0.122297, 0.036558, 0.058745 ], [ 0.111042, 0.092093, 0.085412 ],
- [ 0.099243, 0.115476, 0.039254 ], [ 0.019973, 0.122844, 0.050255 ],
- [ 0.159571, 0.098965, 0.051740 ], [ 0.137624, 0.072405, -0.006922 ],
- [ 0.130240, 0.146091, 0.089698 ], [ 0.138335, 0.092968, 0.136193 ],
- [ 0.066031, 0.149304, 0.125476 ], [ 0.202749, 0.145751, 0.077122 ],
- [ 0.002224, 0.082811, 0.131200 ], [ 0.124476, 0.178073, 0.162336 ],
- [ 0.174722, 0.190298, 0.127106 ], [ 0.202193, 0.153569, 0.163840 ],
- [ 0.242604, 0.197796, 0.136929 ], [ 0.185809, 0.229348, 0.193353 ],
- [ -0.058814, 0.195178, 0.141821 ], [ 0.253646, 0.247175, 0.205766 ],
- [ 0.061433, -0.025542, 0.119311 ], [ -0.057816, 0.082445, 0.073243 ],
- [ -0.069239, 0.148678, 0.031146 ], [ -0.030217, -0.008503, 0.106194 ],
- [ -0.026708, 0.087469, -0.009589 ], [ -0.090418, 0.000265, 0.056807 ],
- [ -0.050607, -0.019383, 0.010494 ], [ -0.079397, 0.008233, -0.011469 ],
- [ -0.072634, -0.061165, 0.046917 ], [ -0.075741, -0.072343, -0.007557 ],
- [ -0.025162, -0.073363, 0.005173 ], [ -0.123371, -0.041257, -0.008375 ],
- [ -0.139904, 0.018285, 0.009920 ], [ -0.143421, -0.104238, 0.033457 ],
- [ -0.100923, -0.134400, -0.023257 ], [ -0.157791, -0.095042, -0.036959 ],
- [ -0.219890, -0.078637, 0.001815 ], [ -0.183607, -0.023053, -0.043678 ],
- [ -0.145303, -0.158923, -0.059045 ], [ -0.197615, -0.165199, 0.028099 ],
- [ -0.225131, -0.167756, -0.056401 ], [ -0.216572, -0.104751, -0.102964 ],
- [ -0.171336, -0.241967, -0.063404 ], [ -0.134035, -0.205614, 0.011831 ],
- [ -0.297116, -0.211173, -0.015352 ], [ -0.086464, -0.200592, -0.070454 ],
- [ -0.217777, -0.278403, 0.030398 ], [ -0.236248, -0.323694, -0.087588 ],
- [ -0.222074, -0.210785, 0.106210 ], [ -0.283400, -0.097077, 0.041303 ],
- [ -0.078417, -0.154464, 0.062956 ], [ -0.214417, -0.100695, 0.121909 ],
- [ -0.178576, -0.028847, 0.061042 ], [ -0.037999, -0.144233, -0.010546 ],
- [ -0.086695, -0.070996, 0.125282 ], [ 0.010788, -0.085006, 0.058527 ],
- [ -0.154015, 0.066560, 0.071038 ], [ -0.143503, 0.033260, 0.154393 ],
- [ -0.134069, 0.032420, -0.056293 ], [ -0.110851, 0.086908, 0.003920 ],
- [ -0.057254, 0.047674, -0.055571 ], [ -0.214206, 0.068784, -0.004735 ],
- [ -0.257264, 0.050468, 0.081702 ], [ -0.291834, 0.004120, -0.022366 ],
- [ -0.173309, -0.029081, -0.115901 ], [ -0.207622, 0.168664, 0.136030 ],
- [ 0.090541, 0.032754, -0.057330 ], [ 0.140219, -0.000735, -0.015633 ],
- [ 0.136697, -0.017163, -0.100909 ], [ 0.029838, -0.089515, -0.147130 ],
- [ -0.055367, -0.072683, -0.214015 ], [ 0.048680, -0.057633, -0.212429 ],
- [ -0.013134, -0.113898, -0.196403 ], [ -0.071702, -0.159408, -0.254895 ]
-];
-
-const SIPRO_LSF_CB4_16K: [[f32; 4]; 128] = [
- [ -0.201277, -0.278679, -0.173262, -0.198580 ],
- [ -0.214667, -0.151922, -0.117551, -0.192713 ],
- [ -0.160962, -0.207728, -0.124750, -0.129749 ],
- [ -0.131043, -0.137818, -0.155281, -0.166308 ],
- [ -0.179134, -0.169602, -0.165223, -0.066293 ],
- [ -0.136474, -0.177035, -0.250127, -0.134370 ],
- [ -0.066970, -0.146274, -0.170638, -0.134436 ],
- [ -0.083288, -0.165860, -0.103437, -0.140361 ],
- [ -0.130474, -0.119317, -0.124393, -0.086408 ],
- [ -0.127609, -0.134415, -0.073592, -0.116103 ],
- [ -0.113027, -0.091756, -0.107786, -0.131935 ],
- [ -0.125530, -0.182152, -0.093796, -0.045088 ],
- [ -0.077122, -0.138052, -0.166271, -0.038886 ],
- [ -0.073027, -0.106845, -0.067073, -0.113910 ],
- [ -0.049146, -0.107019, -0.112531, -0.063388 ],
- [ -0.101539, -0.119586, -0.050297, -0.040670 ],
- [ -0.107784, -0.066913, -0.080993, -0.052352 ],
- [ -0.152155, -0.103010, -0.090461, -0.015526 ],
- [ -0.153087, -0.087656, -0.029889, -0.037367 ],
- [ -0.215281, -0.138062, -0.089162, -0.050839 ],
- [ -0.053350, -0.060169, -0.063459, -0.024499 ],
- [ -0.051674, -0.076355, -0.033733, -0.077211 ],
- [ -0.045047, -0.107006, -0.020880, -0.024525 ],
- [ -0.083003, -0.063672, -0.013243, -0.028324 ],
- [ -0.104104, -0.075450, -0.032746, 0.024480 ],
- [ -0.085695, -0.019502, -0.045121, -0.025016 ],
- [ -0.123120, -0.030844, -0.003533, -0.016224 ],
- [ -0.025568, -0.049172, -0.003911, -0.027522 ],
- [ -0.039029, -0.019857, -0.043211, -0.058087 ],
- [ -0.040122, -0.023067, -0.001356, 0.008607 ],
- [ -0.063351, -0.001776, 0.016015, -0.027088 ],
- [ -0.068110, -0.038838, 0.042525, 0.001076 ],
- [ -0.043623, -0.020736, -0.047862, 0.037710 ],
- [ -0.041052, 0.021954, -0.025660, 0.000758 ],
- [ -0.013035, 0.002583, -0.008233, -0.037300 ],
- [ -0.005523, -0.014670, 0.019651, -0.012667 ],
- [ -0.004409, -0.014437, -0.059412, -0.019701 ],
- [ 0.024946, -0.011663, -0.014351, -0.028762 ],
- [ 0.012660, 0.018489, -0.010205, 0.012695 ],
- [ -0.004423, 0.017827, 0.040544, 0.003629 ],
- [ 0.020684, 0.026743, 0.007752, -0.025595 ],
- [ 0.032071, 0.000043, 0.026188, -0.006444 ],
- [ 0.058793, 0.015820, -0.001119, -0.017415 ],
- [ 0.020156, -0.047590, 0.004227, 0.008670 ],
- [ 0.054770, 0.032135, 0.029770, -0.009767 ],
- [ 0.030884, 0.047757, 0.033068, 0.006866 ],
- [ 0.062039, 0.011646, 0.056037, 0.016859 ],
- [ 0.013798, -0.028196, 0.060710, 0.014299 ],
- [ 0.100043, 0.041445, 0.023379, -0.014889 ],
- [ 0.062728, -0.042821, 0.002180, -0.055380 ],
- [ 0.061663, 0.018767, -0.015571, -0.074095 ],
- [ 0.062980, 0.080497, 0.011808, -0.031787 ],
- [ 0.084964, 0.043100, -0.025877, 0.020309 ],
- [ 0.014707, 0.035421, -0.041440, -0.053373 ],
- [ 0.081268, 0.005791, -0.066290, -0.039825 ],
- [ 0.017691, -0.020401, -0.040513, -0.083960 ],
- [ 0.120874, 0.055753, -0.025988, -0.059552 ],
- [ 0.079912, 0.007894, -0.085380, -0.114587 ],
- [ 0.036856, -0.039331, -0.104237, -0.069116 ],
- [ 0.008526, -0.064273, -0.048312, -0.038595 ],
- [ 0.033461, -0.028956, -0.066505, 0.038722 ],
- [ -0.042064, -0.043989, -0.100653, -0.071550 ],
- [ -0.015342, -0.064850, -0.065675, -0.122769 ],
- [ -0.006581, -0.004919, -0.113564, -0.145753 ],
- [ 0.008273, -0.070702, -0.164998, -0.095541 ],
- [ -0.001698, -0.063744, -0.129971, -0.011162 ],
- [ -0.048471, -0.087500, -0.111006, -0.161823 ],
- [ -0.032193, -0.091955, -0.080642, 0.012288 ],
- [ -0.095873, -0.015986, -0.072722, -0.101745 ],
- [ -0.079477, -0.082060, -0.203008, -0.100297 ],
- [ -0.023883, -0.064022, -0.168341, -0.211739 ],
- [ -0.070530, -0.103547, -0.123858, 0.055049 ],
- [ -0.033503, -0.076812, -0.016287, 0.044159 ],
- [ -0.088427, -0.161682, -0.058579, 0.013873 ],
- [ -0.083068, -0.168222, -0.016773, -0.080209 ],
- [ -0.080548, -0.139090, 0.030544, 0.007171 ],
- [ -0.117482, -0.083718, 0.027074, -0.003674 ],
- [ -0.163085, -0.156856, -0.012618, -0.022329 ],
- [ -0.176540, -0.113042, -0.020148, 0.051770 ],
- [ -0.153891, -0.199293, -0.043244, 0.028331 ],
- [ -0.107822, -0.150615, 0.016430, 0.092919 ],
- [ -0.137676, -0.183224, 0.066026, 0.029343 ],
- [ -0.191106, -0.099250, 0.045370, 0.004084 ],
- [ -0.237042, -0.130815, -0.022543, -0.029428 ],
- [ -0.201014, -0.053591, -0.007305, -0.033547 ],
- [ -0.249286, -0.228408, 0.005002, 0.007146 ],
- [ -0.206509, -0.211998, -0.061352, -0.047233 ],
- [ -0.255702, -0.135114, 0.076375, 0.036630 ],
- [ -0.296271, -0.073946, -0.007273, -0.019601 ],
- [ -0.302917, -0.175111, -0.070024, -0.043905 ],
- [ -0.239275, -0.043962, -0.084982, -0.067446 ],
- [ -0.254583, -0.294720, -0.088762, -0.070451 ],
- [ -0.205583, -0.238996, -0.124753, 0.033076 ],
- [ -0.205583, -0.215882, -0.028472, 0.118679 ],
- [ -0.153640, -0.204464, -0.039654, -0.134441 ],
- [ -0.145929, -0.191970, -0.175308, 0.021366 ],
- [ -0.149348, -0.212569, -0.118324, 0.103812 ],
- [ -0.166397, -0.220581, -0.265260, -0.029113 ],
- [ -0.164171, -0.231262, -0.258828, 0.061427 ],
- [ -0.200198, -0.263453, -0.212016, 0.115359 ],
- [ -0.130088, -0.212168, -0.202368, 0.118563 ],
- [ -0.206387, -0.078075, -0.227856, -0.111165 ],
- [ -0.129605, -0.176848, -0.241584, -0.259900 ],
- [ -0.176826, -0.045901, -0.141712, -0.209345 ],
- [ -0.351173, -0.031097, -0.133935, -0.182412 ],
- [ -0.164232, 0.027006, -0.014039, -0.053567 ],
- [ -0.171037, -0.025924, 0.030972, 0.017329 ],
- [ -0.080862, -0.021577, 0.007652, 0.063968 ],
- [ -0.061788, 0.042024, -0.018783, -0.057979 ],
- [ -0.110311, 0.054760, 0.031446, -0.006710 ],
- [ -0.136637, 0.022171, 0.084991, 0.028039 ],
- [ -0.254471, -0.004376, 0.078034, 0.033649 ],
- [ -0.234464, 0.088157, 0.040999, 0.002639 ],
- [ -0.037095, 0.059443, 0.072180, 0.015027 ],
- [ -0.046841, -0.004813, 0.088266, 0.038786 ],
- [ -0.086782, 0.120100, 0.082655, 0.020271 ],
- [ -0.118361, -0.069242, 0.094867, 0.039200 ],
- [ -0.023342, -0.084303, 0.052684, 0.017093 ],
- [ -0.014194, 0.001012, 0.011946, 0.074125 ],
- [ -0.015342, 0.076396, 0.022365, -0.028001 ],
- [ 0.027706, 0.037047, 0.107573, 0.060815 ],
- [ 0.030615, 0.040664, 0.010467, 0.074289 ],
- [ 0.038646, 0.115584, 0.069627, 0.007642 ],
- [ 0.096463, 0.069818, 0.062494, 0.015413 ],
- [ 0.054834, 0.065232, 0.054286, 0.110088 ],
- [ 0.152312, 0.092371, 0.026420, -0.013184 ],
- [ 0.144264, 0.123438, 0.080131, 0.023233 ],
- [ 0.124405, 0.009943, -0.148477, -0.205184 ]
-];
-
-const SIPRO_MEAN_LSF_16K: [f32; 16] = [
- 0.131554, 0.246615, 0.435896, 0.644419,
- 0.827810, 1.017876, 1.198910, 1.379159,
- 1.562157, 1.736908, 1.940719, 2.131963,
- 2.347162, 2.521521, 2.717870, 2.847068
-];
-
-const SIPRO_POW_0_5: [f32; 16] = [
- 0.5,
- 0.25,
- 0.125,
- 0.0625,
- 0.03125,
- 0.015625,
- 0.0078125,
- 0.00390625,
- 0.001953125,
- 0.0009765625,
- 0.00048828125,
- 0.000244140625,
- 0.0001220703125,
- 0.00006103515625,
- 0.000030517578125,
- 0.0000152587890625
-];
-const SIPRO_POW_0_55: [f32; 10] = [
- 0.550000, 0.302500, 0.166375, 0.091506, 0.050328,
- 0.027681, 0.015224, 0.008373, 0.004605, 0.002533
-];
-const SIPRO_POW_0_7: [f32; 10] = [
- 0.700000, 0.490000, 0.343000, 0.240100, 0.168070,
- 0.117649, 0.082354, 0.057648, 0.040354, 0.028248
-];
-const SIPRO_POW_0_75: [f32; 10] = [
- 0.750000, 0.562500, 0.421875, 0.316406, 0.237305,
- 0.177979, 0.133484, 0.100113, 0.075085, 0.056314
-];
-
-const SIPRO_GAIN_CB_16K: [f32; 32] = [
- 0.07499, 0.10593, 0.14125, 0.18836,
- 0.23714, 0.28184, 0.32734, 0.37584,
- 0.42170, 0.47315, 0.53088, 0.59566,
- 0.66834, 0.74989, 0.84140, 0.94406,
- 1.05925, 1.18850, 1.33352, 1.49624,
- 1.67880, 1.88365, 2.11349, 2.37137,
- 2.66073, 3.05492, 3.54813, 4.21697,
- 5.30884, 7.07946, 9.44061, 13.33521,
-];
-const SIPRO_GAIN_CB_LBR: [[f32; 2]; 128] = [
- [ 0.035230, 0.161540 ], [ 0.049223, 0.448359 ], [ 0.057443, 0.809043 ],
- [ 0.072434, 1.760306 ], [ 0.111491, 0.566418 ], [ 0.112820, 1.098524 ],
- [ 0.143493, 0.726856 ], [ 0.144840, 0.347800 ], [ 0.180341, 1.050010 ],
- [ 0.188171, 2.197256 ], [ 0.189771, 0.256947 ], [ 0.198260, 0.484678 ],
- [ 0.210622, 0.755825 ], [ 0.220694, 0.590788 ], [ 0.237062, 1.322214 ],
- [ 0.255175, 0.338710 ], [ 0.298980, 0.919051 ], [ 0.314627, 0.520961 ],
- [ 0.337106, 1.469863 ], [ 0.341422, 2.804546 ], [ 0.363257, 0.736222 ],
- [ 0.363881, 0.367640 ], [ 0.369850, 1.937934 ], [ 0.370136, 1.075201 ],
- [ 0.397152, 0.549410 ], [ 0.426557, 0.876015 ], [ 0.450686, 0.215588 ],
- [ 0.468116, 0.671848 ], [ 0.470495, 1.242034 ], [ 0.474180, 1.739845 ],
- [ 0.484875, 0.490564 ], [ 0.498917, 0.971238 ], [ 0.530996, 0.785765 ],
- [ 0.539768, 2.130689 ], [ 0.546021, 0.589544 ], [ 0.546632, 3.050846 ],
- [ 0.552336, 0.389775 ], [ 0.556302, 1.400103 ], [ 0.559688, 1.105421 ],
- [ 0.574140, 0.667513 ], [ 0.595547, 0.828943 ], [ 0.597771, 0.496929 ],
- [ 0.617079, 1.863075 ], [ 0.619657, 1.221713 ], [ 0.621172, 0.950275 ],
- [ 0.628426, 0.630766 ], [ 0.628689, 4.242164 ], [ 0.640899, 1.529846 ],
- [ 0.645813, 0.331127 ], [ 0.653056, 0.748168 ], [ 0.662909, 1.077438 ],
- [ 0.669505, 2.631114 ], [ 0.681570, 1.839298 ], [ 0.687844, 0.903400 ],
- [ 0.688660, 1.270830 ], [ 0.695070, 0.578227 ], [ 0.697926, 0.428440 ],
- [ 0.715454, 0.812355 ], [ 0.729981, 1.539357 ], [ 0.737434, 1.106765 ],
- [ 0.740241, 2.033374 ], [ 0.740871, 0.568460 ], [ 0.752689, 0.698461 ],
- [ 0.756587, 0.893078 ], [ 0.767797, 0.499246 ], [ 0.768516, 3.712434 ],
- [ 0.773153, 1.332360 ], [ 0.786125, 1.042996 ], [ 0.788792, 0.238388 ],
- [ 0.790861, 2.273229 ], [ 0.795338, 1.582767 ], [ 0.809621, 0.595501 ],
- [ 0.821032, 0.756460 ], [ 0.824590, 0.922925 ], [ 0.826019, 1.186793 ],
- [ 0.827426, 1.885076 ], [ 0.830080, 6.088666 ], [ 0.837028, 2.819993 ],
- [ 0.845561, 1.490623 ], [ 0.848323, 0.410436 ], [ 0.856522, 0.729725 ],
- [ 0.862636, 0.966880 ], [ 0.874561, 1.681660 ], [ 0.874751, 1.177630 ],
- [ 0.879289, 2.301300 ], [ 0.886671, 0.613068 ], [ 0.896729, 0.781097 ],
- [ 0.904777, 3.484111 ], [ 0.906098, 1.330892 ], [ 0.919182, 1.877203 ],
- [ 0.919901, 0.569511 ], [ 0.921772, 1.034126 ], [ 0.922439, 0.376000 ],
- [ 0.934221, 1.485214 ], [ 0.938842, 0.869135 ], [ 0.939166, 2.378294 ],
- [ 0.958933, 1.122722 ], [ 0.959042, 0.694098 ], [ 0.960995, 1.743430 ],
- [ 0.970763, 2.884897 ], [ 0.982881, 0.814506 ], [ 0.990141, 1.330022 ],
- [ 0.996447, 1.823381 ], [ 1.000013, 0.967498 ], [ 1.000743, 0.480597 ],
- [ 1.008020, 5.095226 ], [ 1.013883, 2.105435 ], [ 1.026438, 0.691312 ],
- [ 1.027361, 1.558169 ], [ 1.030123, 3.586526 ], [ 1.033916, 1.118036 ],
- [ 1.039315, 2.543360 ], [ 1.068596, 0.836380 ], [ 1.081023, 1.318768 ],
- [ 1.093150, 2.267843 ], [ 1.095607, 1.712383 ], [ 1.102816, 1.037334 ],
- [ 1.103231, 3.536292 ], [ 1.107320, 0.508615 ], [ 1.150000, 7.999000 ],
- [ 1.156731, 1.236772 ], [ 1.168428, 2.268084 ], [ 1.184130, 0.775839 ],
- [ 1.210609, 1.511840 ], [ 1.220663, 4.365683 ], [ 1.224016, 0.983179 ],
- [ 1.252236, 2.778535 ], [ 1.301176, 1.923126 ]
-];
-const SIPRO_GAIN_PRED: [f32; 4] = [ 0.200, 0.334, 0.504, 0.691 ];
-
-const SIPRO_GAIN_PITCH_CB_16K: [f32; 16] = [
- 0.00, 0.2, 0.40, 0.5, 0.60, 0.7, 0.75, 0.8,
- 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2,
-];
-const SIPRO_GAIN_DB_CB_16K: [f32; 32] = [
- -22.5, -19.5, -17.0, -14.5,
- -12.5, -11.0, -9.7, -8.5,
- -7.5, -6.5, -5.5, -4.5,
- -3.5, -2.5, -1.5, -0.5,
- 0.5, 1.5, 2.5, 3.5,
- 4.5, 5.5, 6.5, 7.5,
- 8.5, 9.7, 11.0, 12.5,
- 14.5, 17.0, 19.5, 22.5,
-];
-
-const SIPRO_SINC_16K: [f32; 31] = [
- 0.874475, 0.755101, 0.455962, 0.118807, -0.114223, -0.176778,
- -0.101923, 0.015553, 0.086555, 0.078193, 0.018660, -0.037513,
- -0.052733, -0.027459, 0.009967, 0.030278, 0.024050, 0.003055,
- -0.013862, -0.016162, -0.006725, 0.004212, 0.008634, 0.005721,
- -0.000000, -0.003710, -0.003690, -0.001228, 0.001409, 0.002610,
- 0.0
-];
-const SIPRO_SINC_LBR: [f32; 61] = [
- 0.89852900, 0.86505100, 0.76925700, 0.62405400, 0.44863900, 0.265289000,
- 0.09591670, -0.04125980, -0.13433800, -0.17898600, -0.17852800, -0.142609000,
- -0.08493040, -0.02050780, 0.03695680, 0.07739260, 0.09552000, 0.091278100,
- 0.06893920, 0.03570560, 0.0 , -0.03054810, -0.05041500, -0.057006800,
- -0.05084230, -0.03500370, -0.01416020, 0.00665283, 0.02307130, 0.032348600,
- 0.03353880, 0.02758790, 0.01678470, 0.00411987, -0.00747681, -0.015686000,
- -0.01934810, -0.01837160, -0.01376340, -0.00704956, 0.0 , 0.005828860,
- 0.00939941, 0.01037600, 0.00903320, 0.00604248, 0.00238037, -0.001098630,
- -0.00366211, -0.00497437, -0.00503540, -0.00402832, -0.00241089, -0.000579834,
- 0.00103760, 0.00222778, 0.00277710, 0.00271606, 0.00213623, 0.001159670,
- 0.0
-];
diff --git a/nihav-core/src/codecs/ts102366.rs b/nihav-core/src/codecs/ts102366.rs
deleted file mode 100644
index fb452c5..0000000
--- a/nihav-core/src/codecs/ts102366.rs
+++ /dev/null
@@ -1,1534 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use super::*;
-use crate::io::bitreader::*;
-use crate::dsp::fft::*;
-use std::str::FromStr;
-use std::f32::consts;
-
-const BLOCK_LEN: usize = 256;
-const NBLOCKS: usize = 6;
-const MAX_CHANNELS: usize = 5;
-const MAX_CPLBANDS: usize = 18;
-const MAX_BANDS: usize = 50;
-
-const MAGIC_BYTE0: u8 = 0x0B;
-const MAGIC_BYTE1: u8 = 0x77;
-
-const STRATEGY_REUSE: u8 = 0;
-
-const LFE_CHANNEL: usize = MAX_CHANNELS;
-const CPL_CHANNEL: usize = MAX_CHANNELS + 1;
-
-struct IMDCTContext {
- xsincos: [FFTComplex; BLOCK_LEN/2],
- fft: FFT,
- size: usize,
-}
-
-struct IMDCTWorkspace {
- z: [FFTComplex; BLOCK_LEN / 2],
- y: [FFTComplex; BLOCK_LEN / 2],
- out: [f32; BLOCK_LEN * 2],
-}
-
-impl IMDCTContext {
- fn new(bits: usize) -> Self {
- let size = 1 << bits;
- let size4 = 1 << (bits - 2);
- let mut xsincos: [FFTComplex; 512/4] = [FFTC_ZERO; 512/4];
- for k in 0..size4 {
- let factor = 2.0 * consts::PI * ((8 * k + 1) as f32) / ((8 * size) as f32);
- xsincos[k].re = -factor.cos();
- xsincos[k].im = -factor.sin();
- }
- let fft = FFTBuilder::new_fft(FFTMode::SplitRadix, size/4);
- IMDCTContext { xsincos: xsincos, size: size, fft: fft }
- }
- #[allow(non_snake_case)]
- fn do_imdct(&mut self, coeffs: &[i32; BLOCK_LEN], tmp: &mut IMDCTWorkspace) {
- do_imdct_core(&mut self.fft, &self.xsincos, self.size, false, coeffs, &mut tmp.z, &mut tmp.y);
- let w = &TS102366_WINDOW;
- let N2 = self.size / 2;
- let N4 = self.size / 4;
- let N8 = self.size / 8;
- for n in 0..N8 {
- tmp.out[ 2 * n] = -tmp.y[N8 + n] .im * w[ 2 * n];
- tmp.out[ 2 * n + 1] = tmp.y[N8 - n - 1].re * w[ 2 * n + 1];
- tmp.out[ N4 + 2 * n] = -tmp.y[ n] .re * w[N4 + 2 * n];
- tmp.out[ N4 + 2 * n + 1] = tmp.y[N4 - n - 1].im * w[N4 + 2 * n + 1];
- tmp.out[ N2 + 2 * n] = -tmp.y[N8 + n] .re * w[N2 - 2 * n - 1];
- tmp.out[ N2 + 2 * n + 1] = tmp.y[N8 - n - 1].im * w[N2 - 2 * n - 2];
- tmp.out[3 * N4 + 2 * n] = tmp.y[ n] .im * w[N4 - 2 * n - 1];
- tmp.out[3 * N4 + 2 * n + 1] = -tmp.y[N4 - n - 1].re * w[N4 - 2 * n - 2];
- }
- }
- #[allow(non_snake_case)]
- fn do_imdct_ileave(&mut self, coeffs: &[i32; BLOCK_LEN], tmp: &mut IMDCTWorkspace) {
- let mut ziter = tmp.z.chunks_mut(self.size / 4);
- let z1 = ziter.next().unwrap();
- let z2 = ziter.next().unwrap();
- let mut yiter = tmp.y.chunks_mut(self.size / 4);
- let y1 = yiter.next().unwrap();
- let y2 = yiter.next().unwrap();
- do_imdct_core(&mut self.fft, &self.xsincos, self.size, true, coeffs, z1, y1);
- do_imdct_core(&mut self.fft, &self.xsincos, self.size, true, &coeffs[1..], z2, y2);
- let w = &TS102366_WINDOW;
- let N2 = self.size / 2;
- let N4 = self.size / 4;
- let N8 = self.size / 8;
- for n in 0..N8 {
- tmp.out[ 2 * n] = -y1[ n] .im * w[ 2 * n];
- tmp.out[ 2 * n + 1] = y1[N8 - n - 1].re * w[ 2 * n + 1];
- tmp.out[ N4 + 2 * n] = -y1[ n] .re * w[N4 + 2 * n];
- tmp.out[ N4 + 2 * n + 1] = y1[N8 - n - 1].im * w[N4 + 2 * n + 1];
- tmp.out[ N2 + 2 * n] = -y2[ n] .re * w[N2 - 2 * n - 1];
- tmp.out[ N2 + 2 * n + 1] = y2[N8 - n - 1].im * w[N2 - 2 * n - 2];
- tmp.out[3 * N4 + 2 * n] = y2[ n] .im * w[N4 - 2 * n - 1];
- tmp.out[3 * N4 + 2 * n + 1] = -y2[N8 - n - 1].re * w[N4 - 2 * n - 2];
- }
- }
-}
-
-#[allow(non_snake_case)]
-fn do_imdct_core(fft: &mut FFT, xsc: &[FFTComplex; BLOCK_LEN/2], size: usize, ilace: bool, coeffs: &[i32], z: &mut [FFTComplex], y: &mut [FFTComplex]) {
- let N = size;
- let N2 = size / 2;
- let N4 = size / 4;
- let scale = 1.0 / ((1 << 24) as f32);
- for k in 0..N4 {
- let (c0, c1) = if !ilace {
- ((coeffs[N2 - 2 * k - 1] as f32) * scale,
- (coeffs[ 2 * k] as f32) * scale)
- } else {
- ((coeffs[N - 4 * k - 2] as f32) * scale,
- (coeffs[ 4 * k] as f32) * scale)
- };
- let c = FFTComplex { re: c0, im: c1 };
- z[k] = c * xsc[k];
- }
- fft.do_fft_inplace(z, false);
- for k in 0..N4 {
- y[k] = z[k] * xsc[k];
- }
-}
-
-struct AudioDecoder {
- info: Rc<NACodecInfo>,
- ablk: AudioBlock,
- imdct512: IMDCTContext,
- imdct256: IMDCTContext,
- tmp: IMDCTWorkspace,
- delay: [[f32; BLOCK_LEN]; MAX_CHANNELS + 1],
-}
-
-impl AudioDecoder {
- fn new() -> Self {
- AudioDecoder {
- info: NACodecInfo::new_dummy(),
- ablk: AudioBlock::new(),
- imdct512: IMDCTContext::new(9),
- imdct256: IMDCTContext::new(8),
- tmp: IMDCTWorkspace {
- z: [FFTC_ZERO; BLOCK_LEN / 2],
- y: [FFTC_ZERO; BLOCK_LEN / 2],
- out: [0.0; BLOCK_LEN * 2],
- },
- delay: [[0.0; BLOCK_LEN]; MAX_CHANNELS + 1],
- }
- }
-}
-
-const SAMPLE_RATES: [u32; 4] = [ 48000, 44100, 32000, 0 ];
-
-const FRAME_SIZES: [[usize; 64]; 4] = [
- [
- 64, 64, 80, 80, 96, 96, 112, 112,
- 128, 128, 160, 160, 192, 192, 224, 224,
- 256, 256, 320, 320, 384, 384, 448, 448,
- 512, 512, 640, 640, 768, 768, 896, 896,
- 1024, 1024, 1152, 1152, 1280, 1280,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- ], [
- 69, 70, 87, 88, 104, 105, 121, 122,
- 139, 140, 174, 175, 208, 209, 243, 244,
- 278, 279, 348, 349, 417, 418, 487, 488,
- 557, 558, 696, 697, 835, 836, 975, 976,
- 1114, 1115, 1253, 1254, 1393, 1394,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- ], [
- 96, 96, 120, 120, 144, 144, 168, 168,
- 192, 192, 240, 240, 288, 288, 336, 336,
- 384, 384, 480, 480, 576, 576, 672, 672,
- 768, 768, 960, 960, 1152, 1152, 1344, 1344,
- 1536, 1536, 1728, 1728, 1920, 1920,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- ], [ 0; 64 ],
-];
-
-#[derive(Debug,Clone,Copy)]
-struct Syncinfo {
- crc1: u16,
- fscod: u8,
- frmsizecod: u8,
- samplerate: u32,
- frame_size: usize,
-}
-
-impl Syncinfo {
- fn read(br: &mut BitReader) -> DecoderResult<Self> {
- let syncword = br.read(16)?;
- validate!(syncword == ((MAGIC_BYTE0 as u32) * 256) + (MAGIC_BYTE1 as u32));
- let crc1 = br.read(16)? as u16;
- let fscod = br.read(2)? as usize;
- let frmsizecod = br.read(6)? as usize;
- Ok(Syncinfo { crc1: crc1, fscod: fscod as u8, frmsizecod: frmsizecod as u8,
- samplerate: SAMPLE_RATES[fscod], frame_size: FRAME_SIZES[fscod][frmsizecod] * 2 })
- }
- fn is_valid(&self) -> bool {
- (self.samplerate != 0) && (self.frame_size != 0)
- }
-}
-
-trait ReadOptional {
- fn read_optional8(&mut self) -> BitReaderResult<Option<u8>>;
- fn read_optional16(&mut self, bits: u8) -> BitReaderResult<Option<u16>>;
-}
-
-impl<'a> ReadOptional for BitReader<'a> {
- fn read_optional8(&mut self) -> BitReaderResult<Option<u8>> {
- if self.read_bool()? {
- Ok(Some(self.read(8)? as u8))
- } else {
- Ok(None)
- }
- }
- fn read_optional16(&mut self, bits: u8) -> BitReaderResult<Option<u16>> {
- if self.read_bool()? {
- Ok(Some(self.read(bits)? as u16))
- } else {
- Ok(None)
- }
- }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-enum ACMode {
- DualMono,
- Mono,
- Stereo,
- Mode3_0,
- Mode2_1,
- Mode3_1,
- Mode2_2,
- Mode3_2,
-}
-
-impl ACMode {
- fn get_num_channels(&self) -> usize {
- match *self {
- ACMode::DualMono => 2,
- ACMode::Mono => 1,
- ACMode::Stereo => 2,
- ACMode::Mode3_0 => 3,
- ACMode::Mode2_1 => 3,
- ACMode::Mode3_1 => 4,
- ACMode::Mode2_2 => 4,
- ACMode::Mode3_2 => 5,
- }
- }
- fn get_channel_map_str(&self) -> &'static str {
- match *self {
- ACMode::DualMono => "C,C",
- ACMode::Mono => "C",
- ACMode::Stereo => "L,R",
- ACMode::Mode3_0 => "L,C,R",
- ACMode::Mode2_1 => "L,R,Cs",
- ACMode::Mode3_1 => "L,C,R,Cs",
- ACMode::Mode2_2 => "L,R,Ls,Rs",
- ACMode::Mode3_2 => "L,C,R,Ls,Rs",
- }
- }
- fn get_channel_map(&self, has_lfe: bool) -> NAChannelMap {
- let mut chmap = NAChannelMap::from_str(self.get_channel_map_str()).unwrap();
- if has_lfe {
- chmap.add_channel(NAChannelType::LFE);
- }
- chmap
- }
- fn is_3_x(&self) -> bool {
- match *self {
- ACMode::Mode3_0 |
- ACMode::Mode3_1 |
- ACMode::Mode3_2 => true,
- _ => false,
- }
- }
- fn is_surround(&self) -> bool {
- match *self {
- ACMode::Mode2_1 |
- ACMode::Mode3_1 |
- ACMode::Mode2_2 |
- ACMode::Mode3_2 => true,
- _ => false,
- }
- }
-}
-
-const AC_MODES: [ACMode; 8] = [
- ACMode::DualMono, ACMode::Mono, ACMode::Stereo,
- ACMode::Mode3_0, ACMode::Mode2_1,
- ACMode::Mode3_1, ACMode::Mode2_2,
- ACMode::Mode3_2
-];
-
-#[derive(Debug,Clone,Copy)]
-struct Mixinfo {
- dialnorm: u8,
- compr: Option<u8>,
- langcod: Option<u8>,
- mixlevel: Option<u8>,
- roomtyp: Option<u8>,
-}
-
-impl Mixinfo {
- fn read(br: &mut BitReader) -> DecoderResult<Self> {
- let dialnorm = br.read(5)? as u8;
- let compr = br.read_optional8()?;
- let langcod = br.read_optional8()?;
- let (mixlevel, roomtyp) = if br.read_bool()? {
- let mlev = br.read(5)? as u8;
- let rt = br.read(2)? as u8;
- validate!(rt < 3);
- (Some(mlev), Some(rt))
- } else {
- (None, None)
- };
- Ok(Mixinfo { dialnorm, compr, langcod, mixlevel, roomtyp })
- }
-}
-
-#[derive(Debug,Clone,Copy)]
-struct BSI {
- bsid: u8,
- shift: u8,
- bsmod: u8,
- acmod: ACMode,
- cmixlev: Option<u8>,
- surmixlev: Option<u8>,
- dsurmod: Option<u8>,
- lfeon: bool,
- mixinfo: Mixinfo,
- mixinfo2: Option<Mixinfo>,
- copysmth: bool,
- origbs: bool,
- timecod1: Option<u16>,
- timecod2: Option<u16>,
- has_addb: bool,
-}
-
-impl BSI {
- fn read(br: &mut BitReader) -> DecoderResult<BSI> {
- let bsid = br.read(5)? as u8;
- validate!(bsid <= 10);
- let shift = if bsid < 9 { 0 } else { bsid - 9 + 1 };
- let bsmod = br.read(3)? as u8;
- let acmod_id = br.read(3)? as usize;
- validate!(acmod_id < AC_MODES.len());
- let acmod = AC_MODES[acmod_id];
- let cmixlev = if acmod.is_3_x() {
- let cl = br.read(2)? as u8;
- validate!(cl < 3);
- Some(cl)
- } else { None };
- let surmixlev = if acmod.is_surround() {
- let sml = br.read(2)? as u8;
- validate!(sml < 3);
- Some(sml)
- } else { None };
- let dsurmod = if acmod == ACMode::Stereo {
- let dsm = br.read(2)? as u8;
- validate!(dsm < 3);
- Some(dsm)
- } else { None };
- let lfeon = br.read_bool()?;
- let mixinfo = Mixinfo::read(br)?;
- let mixinfo2 = if acmod == ACMode::DualMono {
- Some(Mixinfo::read(br)?)
- } else {
- None
- };
- let copysmth = br.read_bool()?;
- let origbs = br.read_bool()?;
- let timecod1 = br.read_optional16(14)?;
- let timecod2 = br.read_optional16(14)?;
- let has_addb = br.read_bool()?;
- Ok(BSI{
- bsid, shift, bsmod, acmod, lfeon,
- cmixlev, surmixlev, dsurmod,
- mixinfo: mixinfo, mixinfo2: mixinfo2,
- copysmth, origbs, timecod1, timecod2, has_addb,
- })
- }
-}
-
-#[derive(Clone, Copy)]
-struct ChannelData {
- blksw: bool,
- dithflag: bool,
-
- chincpl: bool,
- cplcoe: bool,
- cplcoexp: [u8; MAX_CPLBANDS],
- cplcomant: [u8; MAX_CPLBANDS],
- mstrcplco: u8,
-
- chbwcod: u8,
-
- expstr: u8,
- gainrng: u8,
- startmant: usize,
- endmant: usize,
- groups: usize,
-
- fsnroffst: u8,
- fgaincod: usize,
- snroffset: i32,
-
- deltbae: u8,
- deltnseg: usize,
- deltoffst: [u8; 8],
- deltlen: [usize; 8],
- deltba: [u8; 8],
-
- bap: [u8; 256],
- exps: [u8; 256],
- mant: [i32; 256],
-
- psd: [i16; 256],
- bndpsd: [i32; 64],
-}
-
-const GROUPS: [usize; 4] = [ 0, 3, 6, 12 ];
-const GROUP_BIAS: [usize; 4] = [ 0, 0, 3, 9 ];
-
-fn decode_exps(br: &mut BitReader, dst: &mut [u8], mut prev: u8, grplen: usize) -> DecoderResult<()> {
- let repeat = grplen / 3;
-
- for out in dst.chunks_mut(grplen) {
- let val = br.read(7)? as u8;
- validate!(val < 125);
- let diff: [u8; 3] = [ val / 25, (val / 5) % 5, val % 5 ];
- for (i, exps) in out.chunks_mut(repeat).enumerate() {
- exps[0] = (prev + diff[i]).wrapping_sub(2);
- validate!(exps[0] <= 24);
- for j in 1..repeat {
- exps[j] = exps[0];
- }
- prev = exps[0];
- }
- }
-
- Ok(())
-}
-
-macro_rules! read_bap {
- ($br: expr, $tab:ident, $nbits:expr) => ({
- let val = $br.read($nbits)? as usize;
- validate!(val < $tab.len());
- $tab[val]
- });
- ($br:expr, $tab:ident, $nbits:expr, $bufidx:expr, $bap_buf:expr, $bap_buf_fill:expr) => (
- if $bap_buf_fill[$bufidx] > 0 {
- $bap_buf_fill[$bufidx] -= 1;
- $bap_buf[$bufidx][$bap_buf_fill[$bufidx]]
- } else {
- let val = $br.read($nbits)? as usize;
- validate!(val < $tab.len());
- for i in 1..$tab[0].len() {
- $bap_buf[$bufidx][i - 1] = $tab[val][i];
- }
- $bap_buf_fill[$bufidx] = $tab[0].len() - 1;
- $tab[val][0]
- }
- );
-}
-
-impl ChannelData {
- fn new() -> Self {
- ChannelData {
- blksw: false,
- dithflag: false,
-
- chincpl: false,
- cplcoe: false,
- cplcoexp: [0; MAX_CPLBANDS],
- cplcomant: [0; MAX_CPLBANDS],
- mstrcplco: 0,
-
- chbwcod: 0,
-
- expstr: 0,
- gainrng: 0,
- startmant: 0,
- endmant: 0,
- groups: 0,
-
- fsnroffst: 0,
- fgaincod: 0,
- snroffset: 0,
-
- deltbae: 0,
- deltnseg: 0,
- deltoffst: [0; 8],
- deltlen: [0; 8],
- deltba: [0; 8],
-
- bap: [0; 256],
- exps: [0; 256],
- mant: [0; 256],
-
- psd: [0; 256],
- bndpsd: [0; 64],
- }
- }
- fn read_strategy(&mut self, br: &mut BitReader, blk_no: usize) -> DecoderResult<()> {
- self.expstr = br.read(2)? as u8;
- validate!(blk_no != 0 || self.expstr != STRATEGY_REUSE);
- if self.expstr != STRATEGY_REUSE {
- if self.startmant > 0 {
- self.groups = (self.endmant - self.startmant) / GROUPS[self.expstr as usize];
- } else if self.endmant != 0{
- let idx = self.expstr as usize;
- self.groups = (self.endmant + GROUP_BIAS[idx] - 1) / GROUPS[idx];
- } else {
- self.groups = 0;
- }
- }
- Ok(())
- }
- fn read_exps(&mut self, br: &mut BitReader, is_cpl: bool, is_lfe: bool) -> DecoderResult<()> {
- if self.expstr == STRATEGY_REUSE { return Ok(()); }
- let grpsize = GROUPS[self.expstr as usize];
- self.exps = [0; 256];
- if is_cpl {
- let first = (br.read(4)? as u8) << 1;
- let out = &mut self.exps[self.startmant..self.endmant];
- decode_exps(br, out, first, grpsize)?;
- } else if !is_lfe {
- self.exps[0] = br.read(4)? as u8;
- let first = self.exps[0];
- let out = &mut self.exps[1..self.endmant];
- decode_exps(br, out, first, grpsize)?;
- self.gainrng = br.read(2)? as u8;
- } else {
- self.exps[0] = br.read(4)? as u8;
- let first = self.exps[0];
- let out = &mut self.exps[1..7];
- decode_exps(br, out, first, grpsize)?;
- }
- Ok(())
- }
- fn read_snr(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- self.fsnroffst = br.read(4)? as u8;
- self.fgaincod = br.read(3)? as usize;
- Ok(())
- }
- fn read_deltbai(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- if self.deltbae == 1 {
- self.deltnseg = (br.read(3)? as usize) + 1;
- for seg in 0..self.deltnseg {
- self.deltoffst[seg] = br.read(5)? as u8;
- self.deltlen[seg] = br.read(4)? as usize;
- self.deltba[seg] = br.read(3)? as u8;
- }
- }
- Ok(())
- }
-
- fn compute_bndpsd(&mut self) {
- let start = self.startmant;
- let end = self.endmant;
- let exps = &mut self.exps;
- let psd = &mut self.psd;
- let bndpsd = &mut self.bndpsd;
-
- for bin in start..end {
- psd[bin] = 3072 - ((exps[bin] as i16) << 7);
- }
-
- let mut bin = start;
- let mut band = TS102366_BIN_TO_BAND[bin] as usize;
- let mut lastbin;
- loop {
- lastbin = ((TS102366_BAND_START[band] as usize) + (TS102366_BAND_SIZE[band] as usize)).min(end);
- bndpsd[band] = psd[bin] as i32;
- bin += 1;
- while bin < lastbin {
- bndpsd[band] = logadd(bndpsd[band], psd[bin] as i32);
- bin += 1;
- }
- band += 1;
- if lastbin >= end { break; }
- }
- }
- fn compute_mask(&mut self, mask: &mut [i32; MAX_BANDS], fscod: usize, sgain: u16, fdecay: u8, sdecay: u8,
- dbknee: u16, cplfleak: u16, cplsleak: u16, shift: u8) {
- let fgain = TS102366_FAST_GAIN[self.fgaincod] as i32;
-
- let bndstart = TS102366_BIN_TO_BAND[self.startmant] as usize;
- let bndend = (TS102366_BIN_TO_BAND[self.endmant - 1] as usize) + 1;
-
- let mut excite: [i32; MAX_BANDS] = [0; MAX_BANDS];
-
- let begin;
- let mut fast_leak;
- let mut slow_leak;
- if bndstart == 0 {
- let lowcomp0 = calc_lowcomp(0, self.bndpsd[0], self.bndpsd[1], 0);
- excite[0] = self.bndpsd[0] - fgain - lowcomp0;
- let lowcomp1 = calc_lowcomp(lowcomp0, self.bndpsd[1], self.bndpsd[2], 1);
- excite[1] = self.bndpsd[1] - fgain - lowcomp1;
- let mut sband = 7;
- let mut lowcomp = lowcomp1;
- fast_leak = 0;
- slow_leak = 0;
- for band in 2..7 {
- let not_lfe_case = (bndend != 7) || (band != 6);
- if not_lfe_case {
- lowcomp = calc_lowcomp(lowcomp, self.bndpsd[band], self.bndpsd[band + 1], band);
- }
- fast_leak = self.bndpsd[band] - fgain;
- slow_leak = self.bndpsd[band] - (sgain as i32);
- excite[band] = fast_leak - lowcomp;
- if not_lfe_case {
- if self.bndpsd[band] <= self.bndpsd[band + 1] {
- sband = band + 1;
- break;
- }
- }
- }
- for band in sband..bndend.min(22) {
- if (bndend != 7) || (band != 6) {
- lowcomp = calc_lowcomp(lowcomp, self.bndpsd[band], self.bndpsd[band + 1], band);
- }
- fast_leak = (fast_leak - (fdecay as i32)).max(self.bndpsd[band] - (fgain as i32));
- slow_leak = (slow_leak - (sdecay as i32)).max(self.bndpsd[band] - (sgain as i32));
- excite[band] = slow_leak.max(fast_leak - lowcomp);
- }
- begin = 22;
- } else {
- begin = bndstart;
- fast_leak = cplfleak as i32;
- slow_leak = cplsleak as i32;
- }
- for band in begin..bndend {
- fast_leak = (fast_leak - (fdecay as i32)).max(self.bndpsd[band] - (fgain as i32));
- slow_leak = (slow_leak - (sdecay as i32)).max(self.bndpsd[band] - (sgain as i32));
- excite[band] = fast_leak.max(slow_leak);
- }
- for band in bndstart..bndend {
- if self.bndpsd[band] < (dbknee as i32) {
- excite[band] += ((dbknee as i32) - self.bndpsd[band]) >> 2;
- }
- mask[band] = excite[band].max(TS102366_HTH[fscod][band >> shift] as i32);
- }
- }
- fn apply_delta_info(&mut self, mask: &mut [i32; MAX_BANDS]) {
- if self.deltbae == 0 || self.deltbae == 1 {
- let mut band = TS102366_BIN_TO_BAND[self.startmant] as usize;
- for seg in 0..self.deltnseg {
- band += self.deltoffst[seg] as usize;
- let delta = if self.deltba[seg] >= 4 {
- ((self.deltba[seg] as i32) - 3) << 7
- } else {
- ((self.deltba[seg] as i32) - 4) << 7
- };
- if band + self.deltlen[seg] > MAX_BANDS { break; }
- for _ in 0..self.deltlen[seg] {
- mask[band] += delta;
- band += 1;
- }
- }
- }
- }
- fn calc_snr_offset(&mut self, csnroffst: u8) {
- self.snroffset = ((((csnroffst as i32) - 15) << 4) + (self.fsnroffst as i32)) << 2;
- }
- fn compute_bap(&mut self, mask: &mut [i32; MAX_BANDS], floor: u16) {
- let end = self.endmant;
- let mut band = TS102366_BIN_TO_BAND[self.startmant] as usize;
- let mut bin = self.startmant;
- let mut lastbin;
- loop {
- lastbin = ((TS102366_BAND_START[band] as usize) + (TS102366_BAND_SIZE[band] as usize)).min(end);
- mask[band] = (mask[band] - self.snroffset - (floor as i32)).max(0) & 0x1FE0;
- mask[band] += floor as i32;
- while bin < lastbin {
- let addr = (((self.psd[bin] as i32) - mask[band]) >> 5).min(63).max(0) as usize;
- self.bap[bin] = TS102366_BAPTAB[addr];
- bin += 1;
- }
- if lastbin == end { break; }
- band += 1;
- }
- }
- fn read_mant(&mut self, br: &mut BitReader, bap_buf: &mut [[i32; 2]; 3], bap_buf_fill: &mut [usize; 3]) -> DecoderResult<()> {
- self.mant = [0; BLOCK_LEN];
- for bin in self.startmant..self.endmant {
- self.mant[bin] = match self.bap[bin] {
- 0 => {
- if self.dithflag {
- 42 // todo dither
- } else {
- 0
- }
- },
- 1 => { read_bap!(br, TS102366_QUANT3_MAP, 5, 0, bap_buf, bap_buf_fill) },
- 2 => { read_bap!(br, TS102366_QUANT5_MAP, 7, 1, bap_buf, bap_buf_fill) },
- 3 => { read_bap!(br, TS102366_QUANT7_MAP, 3) },
- 4 => { read_bap!(br, TS102366_QUANT11_MAP, 7, 2, bap_buf, bap_buf_fill) },
- 5 => { read_bap!(br, TS102366_QUANT15_MAP, 4) },
- _ => {
- validate!(self.bap[bin] < 15);
- let nbits = TS102366_BAP_BITS[(self.bap[bin] as usize) - 6];
- let val = br.read(nbits)? as i16;
- ((val << (16 - nbits)) as i32) << 9
- },
- };
- self.mant[bin] >>= self.exps[bin];
- }
- Ok(())
- }
-
- fn synth(&mut self, imdct512: &mut IMDCTContext, imdct256: &mut IMDCTContext, tmp: &mut IMDCTWorkspace, delay: &mut [f32; BLOCK_LEN], dst: &mut [f32]) {
- if !self.blksw {
- imdct512.do_imdct(&self.mant, tmp);
- } else {
- imdct256.do_imdct_ileave(&self.mant, tmp);
- }
- overlap(delay, &tmp.out, dst);
- }
-}
-
-fn logadd(acc: i32, add: i32) -> i32 {
- let c = acc - add;
- let addr = (c.abs() >> 1).min(255);
- if c >= 0 {
- acc + (TS102366_LATAB[addr as usize] as i32)
- } else {
- add + (TS102366_LATAB[addr as usize] as i32)
- }
-}
-
-fn calc_lowcomp(a: i32, b0: i32, b1: i32, band: usize) -> i32 {
- if band < 7 {
- if (b0 + 256) == b1 {
- 384
- } else if b0 > b1 {
- 0.max(a - 64)
- } else {
- a
- }
- } else if band < 20 {
- if (b0 + 256) == b1 {
- 320
- } else if b0 > b1 {
- 0.max(a - 64)
- } else {
- a
- }
- } else {
- 0.max(a - 128)
- }
-}
-
-fn overlap(delay: &mut [f32; BLOCK_LEN], src: &[f32; BLOCK_LEN * 2], out: &mut [f32]) {
- {
- let dly = &delay;
- for ((d, s), o) in dly.into_iter().zip(src.into_iter()).zip(out.iter_mut()) {
- *o = (*d + *s) * 2.0;
- }
- }
- delay.copy_from_slice(&src[BLOCK_LEN..]);
-}
-
-#[derive(Clone)]
-struct AudioBlock {
- dynrng: Option<u8>,
- dynrng2: Option<u8>,
-
- cplstre: bool,
- cplinu: bool,
- phsflginu: bool,
- cplbegf: usize,
- cplendf: usize,
- ncplsubnd: usize,
- ncplbnd: usize,
- cplbndstrc: [bool; MAX_CPLBANDS],
-
- phsflg: [bool; MAX_CPLBANDS],
- rematstr: bool,
- rematflg: [bool; 4],
-
- chdata: [ChannelData; MAX_CHANNELS + 2],
-
- baie: bool,
- fdcycod: usize,
- sdcycod: usize,
- sgaincod: usize,
- dbpbcod: usize,
- floorcod: usize,
- snroffste: bool,
- csnroffst: u8,
- cplleake: bool,
- cplfleak: u8,
- cplsleak: u8,
-
- deltbaie: bool,
-
- bap_buf: [[i32; 2]; 3],
- bap_buf_fill: [usize; 3],
-}
-
-impl AudioBlock {
- fn new() -> Self {
- AudioBlock {
- chdata: [ChannelData::new(); MAX_CHANNELS + 2],
-
- dynrng: None,
- dynrng2: None,
-
- cplstre: false,
- cplinu: false,
- phsflginu: false,
- cplbegf: 0,
- cplendf: 0,
- ncplsubnd: 0,
- ncplbnd: 0,
- cplbndstrc: [false; MAX_CPLBANDS],
-
- phsflg: [false; MAX_CPLBANDS],
- rematstr: false,
- rematflg: [false; 4],
-
- baie: false,
- sdcycod: 0,
- fdcycod: 0,
- sgaincod: 0,
- dbpbcod: 0,
- floorcod: 0,
- snroffste: false,
- csnroffst: 0,
- cplleake: false,
- cplfleak: 0,
- cplsleak: 0,
-
- deltbaie: false,
-
- bap_buf: [[0; 2]; 3],
- bap_buf_fill: [0; 3],
- }
- }
- fn read(&mut self, br: &mut BitReader, bsi: &BSI, fscod: usize, blk_no: usize) -> DecoderResult<bool> {
- let channels = bsi.acmod.get_num_channels();
- let is_stereo = bsi.acmod == ACMode::Stereo;
-
- for ch in 0..channels {
- self.chdata[ch].blksw = br.read_bool()?;
- }
- // dynamic range information
- for ch in 0..channels {
- self.chdata[ch].dithflag = br.read_bool()?;
- }
- self.dynrng = br.read_optional8()?;
- if bsi.acmod == ACMode::DualMono {
- self.dynrng2 = br.read_optional8()?;
- }
- // coupling strategy information
- self.cplstre = br.read_bool()?;
- validate!((blk_no != 0) || self.cplstre);
- if self.cplstre {
- self.cplinu = br.read_bool()?;
- if self.cplinu {
- for ch in 0..channels {
- self.chdata[ch].chincpl = br.read_bool()?;
- }
- if is_stereo {
- self.phsflginu = br.read_bool()?;
- }
- self.cplbegf = br.read(4)? as usize;
- self.cplendf = (br.read(4)? as usize) + 3;
- validate!(self.cplendf >= self.cplbegf);
- self.ncplsubnd = self.cplendf - self.cplbegf;
- self.ncplbnd = self.ncplsubnd;
- self.chdata[CPL_CHANNEL].startmant = self.cplbegf * 12 + 37;
- self.chdata[CPL_CHANNEL].endmant = self.cplendf * 12 + 37;
- for bnd in 1..self.ncplsubnd {
- self.cplbndstrc[bnd] = br.read_bool()?;
- if self.cplbndstrc[bnd] {
- self.ncplbnd -= 1;
- }
- }
- }
- }
- // coupling coordinates
- if self.cplinu {
- for c in 0..channels {
- let ch = &mut self.chdata[c];
- if ch.chincpl {
- ch.cplcoe = br.read_bool()?;
- if ch.cplcoe {
- ch.mstrcplco = br.read(2)? as u8;
- for bnd in 0..self.ncplbnd {
- ch.cplcoexp [bnd] = br.read(4)? as u8;
- ch.cplcomant[bnd] = br.read(4)? as u8;
- }
- }
- }
- }
- if is_stereo && self.phsflginu && (self.chdata[0].cplcoe || self.chdata[1].cplcoe) {
- for bnd in 0..self.ncplbnd {
- self.phsflg[bnd] = br.read_bool()?;
- }
- }
- } else {
- for ch in 0..channels {
- self.chdata[ch].chincpl = false;
- }
- }
- // stereo rematrixing
- if is_stereo {
- self.rematstr = br.read_bool()?;
- if self.rematstr {
- if self.cplbegf > 2 || !self.cplinu {
- for rbnd in 0..4 {
- self.rematflg[rbnd] = br.read_bool()?;
- }
- }
- if self.cplbegf > 0 && self.cplbegf <= 2 && self.cplinu {
- for rbnd in 0..3 {
- self.rematflg[rbnd] = br.read_bool()?;
- }
- }
- if self.cplbegf == 0 && self.cplinu {
- for rbnd in 0..2 {
- self.rematflg[rbnd] = br.read_bool()?;
- }
- }
- }
- }
- // exponent strategy
- if self.cplinu {
- self.chdata[CPL_CHANNEL].read_strategy(br, blk_no)?;
- }
- for ch in 0..channels {
- self.chdata[ch].read_strategy(br, blk_no)?;
- }
- if bsi.lfeon {
- self.chdata[LFE_CHANNEL].expstr = br.read(1)? as u8;
- validate!(blk_no != 0 || self.chdata[LFE_CHANNEL].expstr != STRATEGY_REUSE);
- self.chdata[LFE_CHANNEL].groups = 2;
- self.chdata[LFE_CHANNEL].startmant = 0;
- self.chdata[LFE_CHANNEL].endmant = 7;
- }
- let cpl_startmant = self.chdata[CPL_CHANNEL].startmant;
- for c in 0..channels {
- let ch = &mut self.chdata[c];
- if ch.expstr != STRATEGY_REUSE && !ch.chincpl {
- ch.chbwcod = br.read(6)? as u8;
- }
- if !ch.chincpl {
- ch.startmant = 0;
- ch.endmant = ((ch.chbwcod as usize) + 12) * 3 + 37;
- } else {
- ch.startmant = 0;
- ch.endmant = cpl_startmant;
- }
- }
- // set number of mantissas
- if self.cplinu {
- self.chdata[CPL_CHANNEL].read_exps(br, true, false)?;
- }
- for ch in 0..channels {
- self.chdata[ch].read_exps(br, false, false)?;
- }
- if bsi.lfeon {
- self.chdata[LFE_CHANNEL].read_exps(br, false, true)?;
- }
- // bit allocation parameters
- self.baie = br.read_bool()?;
- if self.baie {
- self.sdcycod = br.read(2)? as usize;
- self.fdcycod = br.read(2)? as usize;
- self.sgaincod = br.read(2)? as usize;
- self.dbpbcod = br.read(2)? as usize;
- self.floorcod = br.read(3)? as usize;
- }
- self.snroffste = br.read_bool()?;
- if self.snroffste {
- self.csnroffst = br.read(6)? as u8;
- if self.cplinu {
- self.chdata[CPL_CHANNEL].read_snr(br)?;
- }
- for ch in 0..channels {
- self.chdata[ch].read_snr(br)?;
- }
- if bsi.lfeon {
- self.chdata[LFE_CHANNEL].read_snr(br)?;
- }
- }
- if self.cplinu {
- self.cplleake = br.read_bool()?;
- if self.cplleake {
- self.cplfleak = br.read(3)? as u8;
- self.cplsleak = br.read(3)? as u8;
- }
- }
- // delta bit allocation information
- self.deltbaie = br.read_bool()?;
- if self.deltbaie {
- if self.cplinu {
- self.chdata[CPL_CHANNEL].deltbae = br.read(2)? as u8;
- validate!(blk_no != 0 || self.chdata[CPL_CHANNEL].deltbae != 0);
- validate!(self.chdata[CPL_CHANNEL].deltbae != 3);
- }
- for ch in 0..channels {
- self.chdata[ch].deltbae = br.read(2)? as u8;
- validate!(blk_no != 0 || self.chdata[ch].deltbae != 0);
- validate!(self.chdata[ch].deltbae != 3);
- }
- if self.cplinu {
- self.chdata[CPL_CHANNEL].read_deltbai(br)?;
- }
- for ch in 0..channels {
- self.chdata[ch].read_deltbai(br)?;
- }
- }
- // dummy data
- if br.read_bool()? {
- let skipl = br.read(9)?;
- br.skip(skipl * 8)?;
- }
-
- let all_zero = self.calc_bitalloc(bsi, channels, fscod);
- if all_zero { return Ok(true); }
-
- // quantised mantissa values
- let mut got_cplchan = false;
- for i in 0..self.bap_buf_fill.len() { self.bap_buf_fill[i] = 0; }
- for c in 0..channels {
- {
- let ch = &mut self.chdata[c];
- ch.read_mant(br, &mut self.bap_buf, &mut self.bap_buf_fill)?;
- }
- if self.cplinu && self.chdata[c].chincpl && !got_cplchan {
- let cplch = &mut self.chdata[CPL_CHANNEL];
- cplch.read_mant(br, &mut self.bap_buf, &mut self.bap_buf_fill)?;
- got_cplchan = true;
- }
- }
- if bsi.lfeon {
- let lfech = &mut self.chdata[LFE_CHANNEL];
- lfech.read_mant(br, &mut self.bap_buf, &mut self.bap_buf_fill)?;
- }
- Ok(false)
- }
- fn calc_bitalloc(&mut self, bsi: &BSI, channels: usize, fscod: usize) -> bool {
- let sdecay1 = TS102366_SLOW_DECAY[self.sdcycod];
- let fdecay1 = TS102366_FAST_DECAY[self.fdcycod];
-
- let sdecay = sdecay1 >> bsi.shift;
- let fdecay = fdecay1 >> bsi.shift;
- let sgain = TS102366_SLOW_GAIN[self.sgaincod];
- let dbknee = TS102366_DBP_TAB[self.dbpbcod];
- let floor = TS102366_FLOOR_TAB[self.floorcod];
-
- let mut all_zero = self.csnroffst == 0;
- if !all_zero && self.chdata[LFE_CHANNEL].fsnroffst == 0 {
- for ch in 0..channels {
- if self.chdata[ch].fsnroffst != 0 {
- all_zero = false;
- break;
- }
- }
- }
- if all_zero { return true; }
-
- let mut mask: [i32; MAX_BANDS] = [0; MAX_BANDS];
-
- if self.cplinu {
- self.chdata[CPL_CHANNEL].compute_bndpsd();
- self.chdata[CPL_CHANNEL].compute_mask(&mut mask, fscod, sgain, fdecay, sdecay, dbknee,
- ((self.cplfleak as u16) << 8) + 768, ((self.cplsleak as u16) << 8) + 768, bsi.shift);
- self.chdata[CPL_CHANNEL].apply_delta_info(&mut mask);
- self.chdata[CPL_CHANNEL].calc_snr_offset(self.csnroffst);
- self.chdata[CPL_CHANNEL].compute_bap(&mut mask, floor);
- }
- for ch in 0..channels {
- self.chdata[ch].compute_bndpsd();
- self.chdata[ch].compute_mask(&mut mask, fscod, sgain, fdecay, sdecay, dbknee, 0, 0, bsi.shift);
- self.chdata[ch].apply_delta_info(&mut mask);
- self.chdata[ch].calc_snr_offset(self.csnroffst);
- self.chdata[ch].compute_bap(&mut mask, floor);
- }
- if bsi.lfeon {
- self.chdata[LFE_CHANNEL].compute_bndpsd();
- self.chdata[LFE_CHANNEL].compute_mask(&mut mask, fscod, sgain, fdecay, sdecay, dbknee,
- 0, 0, bsi.shift);
- self.chdata[LFE_CHANNEL].calc_snr_offset(self.csnroffst);
- self.chdata[LFE_CHANNEL].compute_bap(&mut mask, floor);
- }
-
- false
- }
- fn couple_channels(&mut self, acmod: ACMode) {
- if !self.cplinu { return; }
- for ch in 0..acmod.get_num_channels() {
- if !self.chdata[ch].chincpl { continue; }
- let mut pband = 0;
- for band in self.cplbegf..self.cplendf {
- let cband = band - self.cplbegf;
- let comant = self.chdata[ch].cplcomant[cband];
- let mut cotemp = (if self.chdata[ch].cplcoexp[cband] == 15 { comant << 1 } else { comant + 16 }) as i32;
- if (acmod == ACMode::Stereo) && (ch == 1) && self.phsflginu && self.phsflg[pband] {
- cotemp = -cotemp;
- }
- if !self.cplbndstrc[cband] {
- pband += 1;
- }
- let exp = self.chdata[ch].cplcoexp[cband] + 3 * self.chdata[ch].mstrcplco + 5 - 3;
- let start = band * 12 + 37;
- for bin in 0..12 {
- self.chdata[ch].mant[start + bin] = self.chdata[CPL_CHANNEL].mant[start + bin] * cotemp >> exp;
- }
-//todo dither
- }
- }
- }
- fn rematrix(&mut self) {
- let maxbin = self.chdata[0].endmant.min(self.chdata[1].endmant);
- if self.rematflg[0] {
- let end = maxbin.min(25);
- for bin in 13..end {
- let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin];
- let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin];
- self.chdata[0].mant[bin] = d;
- self.chdata[1].mant[bin] = s;
- }
- if maxbin <= 25 { return; }
- }
- if self.rematflg[1] {
- let end = maxbin.min(37);
- for bin in 25..end {
- let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin];
- let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin];
- self.chdata[0].mant[bin] = d;
- self.chdata[1].mant[bin] = s;
- }
- if maxbin <= 37 { return; }
- }
- if self.rematflg[2] {
- let end = maxbin.min(61);
- for bin in 37..end {
- let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin];
- let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin];
- self.chdata[0].mant[bin] = d;
- self.chdata[1].mant[bin] = s;
- }
- if maxbin <= 61 { return; }
- }
- if self.rematflg[3] {
- let end = maxbin;
- for bin in 61..end {
- let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin];
- let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin];
- self.chdata[0].mant[bin] = d;
- self.chdata[1].mant[bin] = s;
- }
- }
- }
- fn synth_audio_block(&mut self, imdct512: &mut IMDCTContext, imdct256: &mut IMDCTContext, tmp: &mut IMDCTWorkspace, channel: usize, delay: &mut [f32; BLOCK_LEN], dst: &mut [f32]) {
- self.chdata[channel].synth(imdct512, imdct256, tmp, delay, dst);
- }
-}
-
-impl NADecoder for AudioDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(_) = info.get_properties() {
- self.info = info.clone();
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- validate!(pktbuf.len() > 5);
-
- let mut br;
- if (pktbuf[0] == MAGIC_BYTE0) && (pktbuf[1] == MAGIC_BYTE1) {
- br = BitReader::new(pktbuf.as_slice(), pktbuf.len(), BitReaderMode::BE);
- } else if (pktbuf[0] == MAGIC_BYTE1) && (pktbuf[1] == MAGIC_BYTE0) {
- br = BitReader::new(pktbuf.as_slice(), pktbuf.len(), BitReaderMode::LE16MSB);
- } else {
- return Err(DecoderError::InvalidData);
- }
-
- let sinfo = Syncinfo::read(&mut br)?;
- validate!(sinfo.is_valid());
-
- let bsi = BSI::read(&mut br)?;
- if bsi.has_addb {
- let len = br.read(6)? as u32;
- br.skip((len + 1) * 8)?;
- }
-
- let duration = BLOCK_LEN * NBLOCKS;
-
- let core_channels = bsi.acmod.get_num_channels();
- let channels = core_channels + if bsi.lfeon { 1 } else { 0 };
-
- let ainfo = NAAudioInfo::new(sinfo.samplerate >> bsi.shift, channels as u8,
- SND_F32P_FORMAT, BLOCK_LEN);
-
- let mut abuf = alloc_audio_buffer(ainfo, duration, bsi.acmod.get_channel_map(bsi.lfeon))?;
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut output = adata.get_data_mut();
-
- self.ablk = AudioBlock::new();
- for blk in 0..NBLOCKS {
- let all_zero = self.ablk.read(&mut br, &bsi, sinfo.fscod as usize, blk)?;
- let off = blk * BLOCK_LEN;
- self.ablk.couple_channels(bsi.acmod);
- if bsi.acmod == ACMode::Stereo {
- self.ablk.rematrix();
- }
- for ch in 0..core_channels {
- let dpos = abuf.get_offset(ch) + off;
- let dst = &mut output[dpos..][..BLOCK_LEN];
- if !all_zero {
- self.ablk.synth_audio_block(&mut self.imdct512, &mut self.imdct256, &mut self.tmp, ch, &mut self.delay[ch], dst);
- } else {
- self.delay[ch] = [0.0; BLOCK_LEN];
- for i in 0..BLOCK_LEN { dst[i] = 0.0; }
- }
- }
- if bsi.lfeon {
- let dpos = abuf.get_offset(core_channels) + off;
- let dst = &mut output[dpos..][..BLOCK_LEN];
- if !all_zero {
- self.ablk.synth_audio_block(&mut self.imdct512, &mut self.imdct256, &mut self.tmp, LFE_CHANNEL, &mut self.delay[LFE_CHANNEL], dst);
- } else {
- self.delay[LFE_CHANNEL] = [0.0; BLOCK_LEN];
- for i in 0..BLOCK_LEN { dst[i] = 0.0; }
- }
- }
- }
-//todo skip auxdata
-//todo do errorcheck
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(AudioDecoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_ts102366() {
- let file = "assets/RV/sp_sample1.rm";
- test_decode_audio("realmedia", file, Some(12000), "ac3");
- }
-}
-
-const TS102366_SLOW_DECAY: [u8; 4] = [ 0x0F, 0x11, 0x13, 0x15 ];
-const TS102366_FAST_DECAY: [u8; 4] = [ 0x3F, 0x53, 0x67, 0x7B ];
-const TS102366_SLOW_GAIN: [u16; 4] = [ 0x540, 0x4D8, 0x478, 0x410 ];
-const TS102366_FAST_GAIN: [u16; 8] = [ 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380, 0x400 ];
-const TS102366_DBP_TAB: [u16; 4] = [ 0x000, 0x700, 0x900, 0xB00 ];
-const TS102366_FLOOR_TAB: [u16; 8] = [ 0x02F0, 0x02B0, 0x0270, 0x0230, 0x01F0, 0x0170, 0x00F0, 0xF800 ];
-
-const TS102366_BIN_TO_BAND: [u8; 256] = [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 28,
- 28, 29, 29, 29, 30, 30, 30, 31, 31, 31,
- 32, 32, 32, 33, 33, 33, 34, 34, 34, 35,
- 35, 35, 35, 35, 35, 36, 36, 36, 36, 36,
- 36, 37, 37, 37, 37, 37, 37, 38, 38, 38,
- 38, 38, 38, 39, 39, 39, 39, 39, 39, 40,
- 40, 40, 40, 40, 40, 41, 41, 41, 41, 41,
- 41, 41, 41, 41, 41, 41, 41, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 43,
- 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 0, 0, 0
-];
-const TS102366_BAND_SIZE: [u8; MAX_BANDS] = [
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 3, 3,
- 3, 3, 3, 3, 3, 6, 6, 6, 6, 6,
- 6, 12, 12, 12, 12, 24, 24, 24, 24, 24
-];
-const TS102366_BAND_START: [u8; MAX_BANDS] = [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 31,
- 34, 37, 40, 43, 46, 49, 55, 61, 67, 73,
- 79, 85, 97, 109, 121, 133, 157, 181, 205, 229
-];
-
-const TS102366_LATAB: [u16; 256] = [
- 0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003b, 0x003a, 0x0039,
- 0x0038, 0x0037, 0x0036, 0x0035, 0x0034, 0x0034, 0x0033, 0x0032,
- 0x0031, 0x0030, 0x002f, 0x002f, 0x002e, 0x002d, 0x002c, 0x002c,
- 0x002b, 0x002a, 0x0029, 0x0029, 0x0028, 0x0027, 0x0026, 0x0026,
- 0x0025, 0x0024, 0x0024, 0x0023, 0x0023, 0x0022, 0x0021, 0x0021,
- 0x0020, 0x0020, 0x001f, 0x001e, 0x001e, 0x001d, 0x001d, 0x001c,
- 0x001c, 0x001b, 0x001b, 0x001a, 0x001a, 0x0019, 0x0019, 0x0018,
- 0x0018, 0x0017, 0x0017, 0x0016, 0x0016, 0x0015, 0x0015, 0x0015,
- 0x0014, 0x0014, 0x0013, 0x0013, 0x0013, 0x0012, 0x0012, 0x0012,
- 0x0011, 0x0011, 0x0011, 0x0010, 0x0010, 0x0010, 0x000f, 0x000f,
- 0x000f, 0x000e, 0x000e, 0x000e, 0x000d, 0x000d, 0x000d, 0x000d,
- 0x000c, 0x000c, 0x000c, 0x000c, 0x000b, 0x000b, 0x000b, 0x000b,
- 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0009, 0x0009, 0x0009,
- 0x0009, 0x0009, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
- 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0006, 0x0006,
- 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0005, 0x0005,
- 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0004, 0x0004,
- 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
- 0x0004, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
- 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0002,
- 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
- 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
- 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-];
-const TS102366_HTH: [[u16; MAX_BANDS]; 3] = [
- [
- 0x04D0, 0x04D0, 0x0440, 0x0400, 0x03E0, 0x03C0, 0x03B0, 0x03B0, 0x03A0, 0x03A0,
- 0x03A0, 0x03A0, 0x03A0, 0x0390, 0x0390, 0x0390, 0x0380, 0x0380, 0x0370, 0x0370,
- 0x0360, 0x0360, 0x0350, 0x0350, 0x0340, 0x0340, 0x0330, 0x0320, 0x0310, 0x0300,
- 0x02F0, 0x02F0, 0x02F0, 0x02F0, 0x0300, 0x0310, 0x0340, 0x0390, 0x03E0, 0x0420,
- 0x0460, 0x0490, 0x04A0, 0x0460, 0x0440, 0x0440, 0x0520, 0x0800, 0x0840, 0x0840,
- ], [
- 0x04F0, 0x04F0, 0x0460, 0x0410, 0x03E0, 0x03D0, 0x03C0, 0x03B0, 0x03B0, 0x03A0,
- 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x0390, 0x0390, 0x0390, 0x0380, 0x0380, 0x0380,
- 0x0370, 0x0370, 0x0360, 0x0360, 0x0350, 0x0350, 0x0340, 0x0340, 0x0320, 0x0310,
- 0x0300, 0x02F0, 0x02F0, 0x02F0, 0x02F0, 0x0300, 0x0320, 0x0350, 0x0390, 0x03E0,
- 0x0420, 0x0450, 0x04A0, 0x0490, 0x0460, 0x0440, 0x0480, 0x0630, 0x0840, 0x0840,
- ], [
- 0x0580, 0x0580, 0x04B0, 0x0450, 0x0420, 0x03F0, 0x03E0, 0x03D0, 0x03C0, 0x03B0,
- 0x03B0, 0x03B0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0,
- 0x0390, 0x0390, 0x0390, 0x0390, 0x0380, 0x0380, 0x0380, 0x0370, 0x0360, 0x0350,
- 0x0340, 0x0330, 0x0320, 0x0310, 0x0300, 0x02F0, 0x02F0, 0x02F0, 0x0300, 0x0310,
- 0x0330, 0x0350, 0x03C0, 0x0410, 0x0470, 0x04A0, 0x0460, 0x0440, 0x0450, 0x04E0,
- ]
-];
-const TS102366_BAPTAB: [u8; 64] = [
- 0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
- 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10,
- 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14,
- 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15
-];
-
-const TS102366_QUANT3_MAP: [[i32; 3]; 27] = [
- [ -0x0AAAAAA, -0x0AAAAAA, -0x0AAAAAA ],
- [ -0x0AAAAAA, -0x0AAAAAA, 0x00000000 ],
- [ -0x0AAAAAA, -0x0AAAAAA, 0x00AAAAAA ],
- [ -0x0AAAAAA, 0x00000000, -0x0AAAAAA ],
- [ -0x0AAAAAA, 0x00000000, 0x00000000 ],
- [ -0x0AAAAAA, 0x00000000, 0x00AAAAAA ],
- [ -0x0AAAAAA, 0x00AAAAAA, -0x0AAAAAA ],
- [ -0x0AAAAAA, 0x00AAAAAA, 0x00000000 ],
- [ -0x0AAAAAA, 0x00AAAAAA, 0x00AAAAAA ],
- [ 0x00000000, -0x0AAAAAA, -0x0AAAAAA ],
- [ 0x00000000, -0x0AAAAAA, 0x00000000 ],
- [ 0x00000000, -0x0AAAAAA, 0x00AAAAAA ],
- [ 0x00000000, 0x00000000, -0x0AAAAAA ],
- [ 0x00000000, 0x00000000, 0x00000000 ],
- [ 0x00000000, 0x00000000, 0x00AAAAAA ],
- [ 0x00000000, 0x00AAAAAA, -0x0AAAAAA ],
- [ 0x00000000, 0x00AAAAAA, 0x00000000 ],
- [ 0x00000000, 0x00AAAAAA, 0x00AAAAAA ],
- [ 0x00AAAAAA, -0x0AAAAAA, -0x0AAAAAA ],
- [ 0x00AAAAAA, -0x0AAAAAA, 0x00000000 ],
- [ 0x00AAAAAA, -0x0AAAAAA, 0x00AAAAAA ],
- [ 0x00AAAAAA, 0x00000000, -0x0AAAAAA ],
- [ 0x00AAAAAA, 0x00000000, 0x00000000 ],
- [ 0x00AAAAAA, 0x00000000, 0x00AAAAAA ],
- [ 0x00AAAAAA, 0x00AAAAAA, -0x0AAAAAA ],
- [ 0x00AAAAAA, 0x00AAAAAA, 0x00000000 ],
- [ 0x00AAAAAA, 0x00AAAAAA, 0x00AAAAAA ]
-];
-const TS102366_QUANT5_MAP: [[i32; 3]; 125] = [
- [ -0x0CCCCCC, -0x0CCCCCC, -0x0CCCCCC ], [ -0x0CCCCCC, -0x0CCCCCC, -0x0666666 ], [ -0x0CCCCCC, -0x0CCCCCC, 0x00000000 ],
- [ -0x0CCCCCC, -0x0CCCCCC, 0x00666666 ], [ -0x0CCCCCC, -0x0CCCCCC, 0x00CCCCCC ],
- [ -0x0CCCCCC, -0x0666666, -0x0CCCCCC ], [ -0x0CCCCCC, -0x0666666, -0x0666666 ], [ -0x0CCCCCC, -0x0666666, 0x00000000 ],
- [ -0x0CCCCCC, -0x0666666, 0x00666666 ], [ -0x0CCCCCC, -0x0666666, 0x00CCCCCC ],
- [ -0x0CCCCCC, 0x00000000, -0x0CCCCCC ], [ -0x0CCCCCC, 0x00000000, -0x0666666 ], [ -0x0CCCCCC, 0x00000000, 0x00000000 ],
- [ -0x0CCCCCC, 0x00000000, 0x00666666 ], [ -0x0CCCCCC, 0x00000000, 0x00CCCCCC ],
- [ -0x0CCCCCC, 0x00666666, -0x0CCCCCC ], [ -0x0CCCCCC, 0x00666666, -0x0666666 ], [ -0x0CCCCCC, 0x00666666, 0x00000000 ],
- [ -0x0CCCCCC, 0x00666666, 0x00666666 ], [ -0x0CCCCCC, 0x00666666, 0x00CCCCCC ],
- [ -0x0CCCCCC, 0x00CCCCCC, -0x0CCCCCC ], [ -0x0CCCCCC, 0x00CCCCCC, -0x0666666 ], [ -0x0CCCCCC, 0x00CCCCCC, 0x00000000 ],
- [ -0x0CCCCCC, 0x00CCCCCC, 0x00666666 ], [ -0x0CCCCCC, 0x00CCCCCC, 0x00CCCCCC ],
- [ -0x0666666, -0x0CCCCCC, -0x0CCCCCC ], [ -0x0666666, -0x0CCCCCC, -0x0666666 ], [ -0x0666666, -0x0CCCCCC, 0x00000000 ],
- [ -0x0666666, -0x0CCCCCC, 0x00666666 ], [ -0x0666666, -0x0CCCCCC, 0x00CCCCCC ],
- [ -0x0666666, -0x0666666, -0x0CCCCCC ], [ -0x0666666, -0x0666666, -0x0666666 ], [ -0x0666666, -0x0666666, 0x00000000 ],
- [ -0x0666666, -0x0666666, 0x00666666 ], [ -0x0666666, -0x0666666, 0x00CCCCCC ],
- [ -0x0666666, 0x00000000, -0x0CCCCCC ], [ -0x0666666, 0x00000000, -0x0666666 ], [ -0x0666666, 0x00000000, 0x00000000 ],
- [ -0x0666666, 0x00000000, 0x00666666 ], [ -0x0666666, 0x00000000, 0x00CCCCCC ],
- [ -0x0666666, 0x00666666, -0x0CCCCCC ], [ -0x0666666, 0x00666666, -0x0666666 ], [ -0x0666666, 0x00666666, 0x00000000 ],
- [ -0x0666666, 0x00666666, 0x00666666 ], [ -0x0666666, 0x00666666, 0x00CCCCCC ],
- [ -0x0666666, 0x00CCCCCC, -0x0CCCCCC ], [ -0x0666666, 0x00CCCCCC, -0x0666666 ], [ -0x0666666, 0x00CCCCCC, 0x00000000 ],
- [ -0x0666666, 0x00CCCCCC, 0x00666666 ], [ -0x0666666, 0x00CCCCCC, 0x00CCCCCC ],
- [ 0x00000000, -0x0CCCCCC, -0x0CCCCCC ], [ 0x00000000, -0x0CCCCCC, -0x0666666 ], [ 0x00000000, -0x0CCCCCC, 0x00000000 ],
- [ 0x00000000, -0x0CCCCCC, 0x00666666 ], [ 0x00000000, -0x0CCCCCC, 0x00CCCCCC ],
- [ 0x00000000, -0x0666666, -0x0CCCCCC ], [ 0x00000000, -0x0666666, -0x0666666 ], [ 0x00000000, -0x0666666, 0x00000000 ],
- [ 0x00000000, -0x0666666, 0x00666666 ], [ 0x00000000, -0x0666666, 0x00CCCCCC ],
- [ 0x00000000, 0x00000000, -0x0CCCCCC ], [ 0x00000000, 0x00000000, -0x0666666 ], [ 0x00000000, 0x00000000, 0x00000000 ],
- [ 0x00000000, 0x00000000, 0x00666666 ], [ 0x00000000, 0x00000000, 0x00CCCCCC ],
- [ 0x00000000, 0x00666666, -0x0CCCCCC ], [ 0x00000000, 0x00666666, -0x0666666 ], [ 0x00000000, 0x00666666, 0x00000000 ],
- [ 0x00000000, 0x00666666, 0x00666666 ], [ 0x00000000, 0x00666666, 0x00CCCCCC ],
- [ 0x00000000, 0x00CCCCCC, -0x0CCCCCC ], [ 0x00000000, 0x00CCCCCC, -0x0666666 ], [ 0x00000000, 0x00CCCCCC, 0x00000000 ],
- [ 0x00000000, 0x00CCCCCC, 0x00666666 ], [ 0x00000000, 0x00CCCCCC, 0x00CCCCCC ],
- [ 0x00666666, -0x0CCCCCC, -0x0CCCCCC ], [ 0x00666666, -0x0CCCCCC, -0x0666666 ], [ 0x00666666, -0x0CCCCCC, 0x00000000 ],
- [ 0x00666666, -0x0CCCCCC, 0x00666666 ], [ 0x00666666, -0x0CCCCCC, 0x00CCCCCC ],
- [ 0x00666666, -0x0666666, -0x0CCCCCC ], [ 0x00666666, -0x0666666, -0x0666666 ], [ 0x00666666, -0x0666666, 0x00000000 ],
- [ 0x00666666, -0x0666666, 0x00666666 ], [ 0x00666666, -0x0666666, 0x00CCCCCC ],
- [ 0x00666666, 0x00000000, -0x0CCCCCC ], [ 0x00666666, 0x00000000, -0x0666666 ], [ 0x00666666, 0x00000000, 0x00000000 ],
- [ 0x00666666, 0x00000000, 0x00666666 ], [ 0x00666666, 0x00000000, 0x00CCCCCC ],
- [ 0x00666666, 0x00666666, -0x0CCCCCC ], [ 0x00666666, 0x00666666, -0x0666666 ], [ 0x00666666, 0x00666666, 0x00000000 ],
- [ 0x00666666, 0x00666666, 0x00666666 ], [ 0x00666666, 0x00666666, 0x00CCCCCC ],
- [ 0x00666666, 0x00CCCCCC, -0x0CCCCCC ], [ 0x00666666, 0x00CCCCCC, -0x0666666 ], [ 0x00666666, 0x00CCCCCC, 0x00000000 ],
- [ 0x00666666, 0x00CCCCCC, 0x00666666 ], [ 0x00666666, 0x00CCCCCC, 0x00CCCCCC ],
- [ 0x00CCCCCC, -0x0CCCCCC, -0x0CCCCCC ], [ 0x00CCCCCC, -0x0CCCCCC, -0x0666666 ], [ 0x00CCCCCC, -0x0CCCCCC, 0x00000000 ],
- [ 0x00CCCCCC, -0x0CCCCCC, 0x00666666 ], [ 0x00CCCCCC, -0x0CCCCCC, 0x00CCCCCC ],
- [ 0x00CCCCCC, -0x0666666, -0x0CCCCCC ], [ 0x00CCCCCC, -0x0666666, -0x0666666 ], [ 0x00CCCCCC, -0x0666666, 0x00000000 ],
- [ 0x00CCCCCC, -0x0666666, 0x00666666 ], [ 0x00CCCCCC, -0x0666666, 0x00CCCCCC ],
- [ 0x00CCCCCC, 0x00000000, -0x0CCCCCC ], [ 0x00CCCCCC, 0x00000000, -0x0666666 ], [ 0x00CCCCCC, 0x00000000, 0x00000000 ],
- [ 0x00CCCCCC, 0x00000000, 0x00666666 ], [ 0x00CCCCCC, 0x00000000, 0x00CCCCCC ],
- [ 0x00CCCCCC, 0x00666666, -0x0CCCCCC ], [ 0x00CCCCCC, 0x00666666, -0x0666666 ], [ 0x00CCCCCC, 0x00666666, 0x00000000 ],
- [ 0x00CCCCCC, 0x00666666, 0x00666666 ], [ 0x00CCCCCC, 0x00666666, 0x00CCCCCC ],
- [ 0x00CCCCCC, 0x00CCCCCC, -0x0CCCCCC ], [ 0x00CCCCCC, 0x00CCCCCC, -0x0666666 ], [ 0x00CCCCCC, 0x00CCCCCC, 0x00000000 ],
- [ 0x00CCCCCC, 0x00CCCCCC, 0x00666666 ], [ 0x00CCCCCC, 0x00CCCCCC, 0x00CCCCCC ],
-];
-const TS102366_QUANT7_MAP: [i32; 7] = [
- -0xDB6DB6, -0x924924, -0x492492, 0x000000, 0x492492, 0x924924, 0xDB6DB6
-];
-const TS102366_QUANT11_MAP: [[i32; 2]; 121] = [
- [ -0x0E8BA2E, -0x0E8BA2E ], [ -0x0E8BA2E, -0x0BA2E8B ], [ -0x0E8BA2E, -0x08BA2E8 ],
- [ -0x0E8BA2E, -0x05D1745 ], [ -0x0E8BA2E, -0x02E8BA2 ], [ -0x0E8BA2E, 0x00000000 ],
- [ -0x0E8BA2E, 0x002E8BA2 ], [ -0x0E8BA2E, 0x005D1745 ], [ -0x0E8BA2E, 0x008BA2E8 ],
- [ -0x0E8BA2E, 0x00BA2E8B ], [ -0x0E8BA2E, 0x00E8BA2E ], [ -0x0BA2E8B, -0x0E8BA2E ],
- [ -0x0BA2E8B, -0x0BA2E8B ], [ -0x0BA2E8B, -0x08BA2E8 ], [ -0x0BA2E8B, -0x05D1745 ],
- [ -0x0BA2E8B, -0x02E8BA2 ], [ -0x0BA2E8B, 0x00000000 ], [ -0x0BA2E8B, 0x002E8BA2 ],
- [ -0x0BA2E8B, 0x005D1745 ], [ -0x0BA2E8B, 0x008BA2E8 ], [ -0x0BA2E8B, 0x00BA2E8B ],
- [ -0x0BA2E8B, 0x00E8BA2E ], [ -0x08BA2E8, -0x0E8BA2E ], [ -0x08BA2E8, -0x0BA2E8B ],
- [ -0x08BA2E8, -0x08BA2E8 ], [ -0x08BA2E8, -0x05D1745 ], [ -0x08BA2E8, -0x02E8BA2 ],
- [ -0x08BA2E8, 0x00000000 ], [ -0x08BA2E8, 0x002E8BA2 ], [ -0x08BA2E8, 0x005D1745 ],
- [ -0x08BA2E8, 0x008BA2E8 ], [ -0x08BA2E8, 0x00BA2E8B ], [ -0x08BA2E8, 0x00E8BA2E ],
- [ -0x05D1745, -0x0E8BA2E ], [ -0x05D1745, -0x0BA2E8B ], [ -0x05D1745, -0x08BA2E8 ],
- [ -0x05D1745, -0x05D1745 ], [ -0x05D1745, -0x02E8BA2 ], [ -0x05D1745, 0x00000000 ],
- [ -0x05D1745, 0x002E8BA2 ], [ -0x05D1745, 0x005D1745 ], [ -0x05D1745, 0x008BA2E8 ],
- [ -0x05D1745, 0x00BA2E8B ], [ -0x05D1745, 0x00E8BA2E ], [ -0x02E8BA2, -0x0E8BA2E ],
- [ -0x02E8BA2, -0x0BA2E8B ], [ -0x02E8BA2, -0x08BA2E8 ], [ -0x02E8BA2, -0x05D1745 ],
- [ -0x02E8BA2, -0x02E8BA2 ], [ -0x02E8BA2, 0x00000000 ], [ -0x02E8BA2, 0x002E8BA2 ],
- [ -0x02E8BA2, 0x005D1745 ], [ -0x02E8BA2, 0x008BA2E8 ], [ -0x02E8BA2, 0x00BA2E8B ],
- [ -0x02E8BA2, 0x00E8BA2E ], [ 0x00000000, -0x0E8BA2E ], [ 0x00000000, -0x0BA2E8B ],
- [ 0x00000000, -0x08BA2E8 ], [ 0x00000000, -0x05D1745 ], [ 0x00000000, -0x02E8BA2 ],
- [ 0x00000000, 0x00000000 ], [ 0x00000000, 0x002E8BA2 ], [ 0x00000000, 0x005D1745 ],
- [ 0x00000000, 0x008BA2E8 ], [ 0x00000000, 0x00BA2E8B ], [ 0x00000000, 0x00E8BA2E ],
- [ 0x002E8BA2, -0x0E8BA2E ], [ 0x002E8BA2, -0x0BA2E8B ], [ 0x002E8BA2, -0x08BA2E8 ],
- [ 0x002E8BA2, -0x05D1745 ], [ 0x002E8BA2, -0x02E8BA2 ], [ 0x002E8BA2, 0x00000000 ],
- [ 0x002E8BA2, 0x002E8BA2 ], [ 0x002E8BA2, 0x005D1745 ], [ 0x002E8BA2, 0x008BA2E8 ],
- [ 0x002E8BA2, 0x00BA2E8B ], [ 0x002E8BA2, 0x00E8BA2E ], [ 0x005D1745, -0x0E8BA2E ],
- [ 0x005D1745, -0x0BA2E8B ], [ 0x005D1745, -0x08BA2E8 ], [ 0x005D1745, -0x05D1745 ],
- [ 0x005D1745, -0x02E8BA2 ], [ 0x005D1745, 0x00000000 ], [ 0x005D1745, 0x002E8BA2 ],
- [ 0x005D1745, 0x005D1745 ], [ 0x005D1745, 0x008BA2E8 ], [ 0x005D1745, 0x00BA2E8B ],
- [ 0x005D1745, 0x00E8BA2E ], [ 0x008BA2E8, -0x0E8BA2E ], [ 0x008BA2E8, -0x0BA2E8B ],
- [ 0x008BA2E8, -0x08BA2E8 ], [ 0x008BA2E8, -0x05D1745 ], [ 0x008BA2E8, -0x02E8BA2 ],
- [ 0x008BA2E8, 0x00000000 ], [ 0x008BA2E8, 0x002E8BA2 ], [ 0x008BA2E8, 0x005D1745 ],
- [ 0x008BA2E8, 0x008BA2E8 ], [ 0x008BA2E8, 0x00BA2E8B ], [ 0x008BA2E8, 0x00E8BA2E ],
- [ 0x00BA2E8B, -0x0E8BA2E ], [ 0x00BA2E8B, -0x0BA2E8B ], [ 0x00BA2E8B, -0x08BA2E8 ],
- [ 0x00BA2E8B, -0x05D1745 ], [ 0x00BA2E8B, -0x02E8BA2 ], [ 0x00BA2E8B, 0x00000000 ],
- [ 0x00BA2E8B, 0x002E8BA2 ], [ 0x00BA2E8B, 0x005D1745 ], [ 0x00BA2E8B, 0x008BA2E8 ],
- [ 0x00BA2E8B, 0x00BA2E8B ], [ 0x00BA2E8B, 0x00E8BA2E ], [ 0x00E8BA2E, -0x0E8BA2E ],
- [ 0x00E8BA2E, -0x0BA2E8B ], [ 0x00E8BA2E, -0x08BA2E8 ], [ 0x00E8BA2E, -0x05D1745 ],
- [ 0x00E8BA2E, -0x02E8BA2 ], [ 0x00E8BA2E, 0x00000000 ], [ 0x00E8BA2E, 0x002E8BA2 ],
- [ 0x00E8BA2E, 0x005D1745 ], [ 0x00E8BA2E, 0x008BA2E8 ], [ 0x00E8BA2E, 0x00BA2E8B ],
- [ 0x00E8BA2E, 0x00E8BA2E ],
-];
-const TS102366_QUANT15_MAP: [i32; 15] = [
- -0x0EEEEEE, -0x0CCCCCC, -0x0AAAAAA, -0x0888888, -0x0666666, -0x0444444, -0x0222222, 0x00000000,
- 0x00222222, 0x00444444, 0x00666666, 0x00888888, 0x00AAAAAA, 0x00CCCCCC, 0x00EEEEEE,
-];
-const TS102366_BAP_BITS: [u8; 10] = [ 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 ];
-
-const TS102366_WINDOW: [f32; 256] = [
- 0.00014, 0.00024, 0.00037, 0.00051, 0.00067, 0.00086, 0.00107, 0.00130,
- 0.00157, 0.00187, 0.00220, 0.00256, 0.00297, 0.00341, 0.00390, 0.00443,
- 0.00501, 0.00564, 0.00632, 0.00706, 0.00785, 0.00871, 0.00962, 0.01061,
- 0.01166, 0.01279, 0.01399, 0.01526, 0.01662, 0.01806, 0.01959, 0.02121,
- 0.02292, 0.02472, 0.02662, 0.02863, 0.03073, 0.03294, 0.03527, 0.03770,
- 0.04025, 0.04292, 0.04571, 0.04862, 0.05165, 0.05481, 0.05810, 0.06153,
- 0.06508, 0.06878, 0.07261, 0.07658, 0.08069, 0.08495, 0.08935, 0.09389,
- 0.09859, 0.10343, 0.10842, 0.11356, 0.11885, 0.12429, 0.12988, 0.13563,
- 0.14152, 0.14757, 0.15376, 0.16011, 0.16661, 0.17325, 0.18005, 0.18699,
- 0.19407, 0.20130, 0.20867, 0.21618, 0.22382, 0.23161, 0.23952, 0.24757,
- 0.25574, 0.26404, 0.27246, 0.28100, 0.28965, 0.29841, 0.30729, 0.31626,
- 0.32533, 0.33450, 0.34376, 0.35311, 0.36253, 0.37204, 0.38161, 0.39126,
- 0.40096, 0.41072, 0.42054, 0.43040, 0.44030, 0.45023, 0.46020, 0.47019,
- 0.48020, 0.49022, 0.50025, 0.51028, 0.52031, 0.53033, 0.54033, 0.55031,
- 0.56026, 0.57019, 0.58007, 0.58991, 0.59970, 0.60944, 0.61912, 0.62873,
- 0.63827, 0.64774, 0.65713, 0.66643, 0.67564, 0.68476, 0.69377, 0.70269,
- 0.71150, 0.72019, 0.72877, 0.73723, 0.74557, 0.75378, 0.76186, 0.76981,
- 0.77762, 0.78530, 0.79283, 0.80022, 0.80747, 0.81457, 0.82151, 0.82831,
- 0.83496, 0.84145, 0.84779, 0.85398, 0.86001, 0.86588, 0.87160, 0.87716,
- 0.88257, 0.88782, 0.89291, 0.89785, 0.90264, 0.90728, 0.91176, 0.91610,
- 0.92028, 0.92432, 0.92822, 0.93197, 0.93558, 0.93906, 0.94240, 0.94560,
- 0.94867, 0.95162, 0.95444, 0.95713, 0.95971, 0.96217, 0.96451, 0.96674,
- 0.96887, 0.97089, 0.97281, 0.97463, 0.97635, 0.97799, 0.97953, 0.98099,
- 0.98236, 0.98366, 0.98488, 0.98602, 0.98710, 0.98811, 0.98905, 0.98994,
- 0.99076, 0.99153, 0.99225, 0.99291, 0.99353, 0.99411, 0.99464, 0.99513,
- 0.99558, 0.99600, 0.99639, 0.99674, 0.99706, 0.99736, 0.99763, 0.99788,
- 0.99811, 0.99831, 0.99850, 0.99867, 0.99882, 0.99895, 0.99908, 0.99919,
- 0.99929, 0.99938, 0.99946, 0.99953, 0.99959, 0.99965, 0.99969, 0.99974,
- 0.99978, 0.99981, 0.99984, 0.99986, 0.99988, 0.99990, 0.99992, 0.99993,
- 0.99994, 0.99995, 0.99996, 0.99997, 0.99998, 0.99998, 0.99998, 0.99999,
- 0.99999, 0.99999, 0.99999, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000,
- 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000,
-];
diff --git a/nihav-core/src/demuxers/avi.rs b/nihav-core/src/demuxers/avi.rs
deleted file mode 100644
index a326561..0000000
--- a/nihav-core/src/demuxers/avi.rs
+++ /dev/null
@@ -1,421 +0,0 @@
-use super::*;
-use crate::register;
-use super::DemuxerError::*;
-//use io::byteio::*;
-//use frame::*;
-use crate::formats::*;
-
-macro_rules! mktag {
- ($a:expr, $b:expr, $c:expr, $d:expr) => ({
- (($a as u32) << 24) | (($b as u32) << 16) | (($c as u32) << 8) | ($d as u32)
- });
- ($arr:expr) => ({
- (($arr[0] as u32) << 24) | (($arr[1] as u32) << 16) | (($arr[2] as u32) << 8) | ($arr[3] as u32)
- });
-}
-
-struct StreamState {
- strm_no: u8,
- got_strf: bool,
- strm_type: Option<StreamType>,
-}
-
-impl StreamState {
- fn new() -> Self {
- StreamState { strm_no: 0, got_strf: true, strm_type: None }
- }
- fn reset(&mut self) {
- self.strm_type = None;
- self.got_strf = true;
- self.strm_no += 1;
- }
- fn valid_state(&self) -> bool {
- match self.strm_type {
- None => self.got_strf,
- _ => false,
- }
- }
-}
-
-#[allow(dead_code)]
-struct AVIDemuxer<'a> {
- src: &'a mut ByteReader<'a>,
- cur_frame: Vec<u64>,
- num_streams: u8,
- size: usize,
- movi_size: usize,
- sstate: StreamState,
- tb_num: u32,
- tb_den: u32,
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-enum RIFFTag {
- Chunk(u32),
- List(u32,u32),
-}
-
-struct RIFFParser {
- tag: RIFFTag,
- parse: fn(&mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize>,
-}
-
-impl<'a> DemuxCore<'a> for AVIDemuxer<'a> {
- #[allow(unused_variables)]
- fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- self.read_header(strmgr)?;
- Ok(())
- }
-
- fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
- if self.movi_size == 0 { return Err(EOF); }
- let mut tag: [u8; 4] = [0; 4];
- loop {
- if (self.src.tell() & 1) == 1 {
- self.src.read_skip(1)?;
- self.movi_size -= 1;
- if self.movi_size == 0 { return Err(EOF); }
- }
- self.src.read_buf(&mut tag)?;
- let size = self.src.read_u32le()? as usize;
- if mktag!(tag) == mktag!(b"JUNK") {
- self.movi_size -= size + 8;
- self.src.read_skip(size)?;
- if self.movi_size == 0 { return Err(EOF); }
- continue;
- }
- if mktag!(tag) == mktag!(b"LIST") {
- self.movi_size -= 12;
- self.src.read_skip(4)?;
- if self.movi_size == 0 { return Err(EOF); }
- continue;
- }
- if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' {
- return Err(InvalidData);
- }
- let stream_no = (tag[0] - b'0') * 10 + (tag[1] - b'0');
- let str = strmgr.get_stream(stream_no as usize);
- if let None = str { return Err(InvalidData); }
- let stream = str.unwrap();
- if size == 0 {
- self.movi_size -= 8;
- if self.movi_size == 0 { return Err(EOF); }
- continue;
- }
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(Some(self.cur_frame[stream_no as usize]), None, None, tb_num, tb_den);
- let pkt = self.src.read_packet(stream, ts, false, size)?;
- self.cur_frame[stream_no as usize] += 1;
- self.movi_size -= size + 8;
-
- return Ok(pkt);
- }
- }
-
- #[allow(unused_variables)]
- fn seek(&mut self, time: u64) -> DemuxerResult<()> {
- Err(NotImplemented)
- }
-}
-
-impl<'a> AVIDemuxer<'a> {
- fn new(io: &'a mut ByteReader<'a>) -> Self {
- AVIDemuxer {
- cur_frame: Vec::new(),
- num_streams: 0,
- src: io,
- size: 0,
- movi_size: 0,
- sstate: StreamState::new(),
- tb_num: 0,
- tb_den: 0,
- }
- }
-
- fn parse_chunk(&mut self, strmgr: &mut StreamManager, end_tag: RIFFTag, csize: usize, depth: u16) -> DemuxerResult<(usize, bool)> {
- if csize < 8 { return Err(InvalidData); }
- if depth > 42 { return Err(InvalidData); }
-
- let tag = self.src.read_u32be()?;
- let size = self.src.read_u32le()? as usize;
- if size > csize { return Err(InvalidData); }
- if RIFFTag::Chunk(tag) == end_tag {
- return Ok((size, true));
- }
- let is_list = is_list_tag(tag);
- let ltag = if is_list { self.src.read_u32be()? } else { 0 };
- if RIFFTag::List(tag, ltag) == end_tag {
- return Ok((size, true));
- }
-
- for i in 0..CHUNKS.len() {
- if RIFFTag::Chunk(tag) == CHUNKS[i].tag {
- let psize = (CHUNKS[i].parse)(self, strmgr, size)?;
- if psize != size { return Err(InvalidData); }
- if (psize & 1) == 1 { self.src.read_skip(1)?; }
- return Ok((size + 8, false));
- }
- if RIFFTag::List(tag, ltag) == CHUNKS[i].tag {
- let mut rest_size = size - 4;
- let psize = (CHUNKS[i].parse)(self, strmgr, rest_size)?;
- if psize > rest_size { return Err(InvalidData); }
- rest_size -= psize;
- while rest_size > 0 {
- let (psize, _) = self.parse_chunk(strmgr, end_tag, rest_size, depth+1)?;
- if psize > rest_size { return Err(InvalidData); }
- rest_size -= psize;
- if (psize & 1) == 1 {
- if rest_size > 0 {
- rest_size -= 1;
- }
- }
- }
-
- return Ok((size + 8, false));
- }
- }
- if !is_list {
- self.src.read_skip(size)?;
- } else {
- if size < 4 { return Err(InvalidData); }
- self.src.read_skip(size - 4)?;
- }
- if (size & 1) == 1 { self.src.read_skip(1)?; }
- return Ok((size + 8, false));
- }
-
- fn read_header(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- let riff_tag = self.src.read_u32be()?;
- let size = self.src.read_u32le()? as usize;
- let avi_tag = self.src.read_u32be()?;
- if riff_tag != mktag!(b"RIFF") || avi_tag != mktag!(b"AVI ") {
- return Err(InvalidData);
- }
- self.size = size;
- let mut rest_size = size;
- loop {
- let (csz, end) = self.parse_chunk(strmgr, RIFFTag::List(mktag!(b"LIST"), mktag!(b"movi")), rest_size,0)?;
- if end { self.movi_size = csz - 4; break; }
- rest_size -= csz;
- }
- if !self.sstate.valid_state() || self.sstate.strm_no != self.num_streams {
- return Err(InvalidData);
- }
- Ok(())
- }
-
- fn read_extradata(&mut self, size: usize) -> DemuxerResult<Option<Vec<u8>>> {
- if size == 0 { return Ok(None); }
- let mut edvec: Vec<u8> = Vec::with_capacity(size);
- edvec.resize(size, 0);
- self.src.read_buf(&mut edvec)?;
- Ok(Some(edvec))
- }
-}
-
-const CHUNKS: [RIFFParser; 6] = [
- RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"hdrl")), parse: parse_hdrl },
- RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"strl")), parse: parse_strl },
- RIFFParser { tag: RIFFTag::Chunk(mktag!(b"avih")), parse: parse_avih },
- RIFFParser { tag: RIFFTag::Chunk(mktag!(b"strf")), parse: parse_strf },
- RIFFParser { tag: RIFFTag::Chunk(mktag!(b"strh")), parse: parse_strh },
- RIFFParser { tag: RIFFTag::Chunk(mktag!(b"JUNK")), parse: parse_junk },
-];
-
-fn is_list_tag(tag: u32) -> bool {
- for i in 0..CHUNKS.len() {
- if let RIFFTag::List(ltag, _) = CHUNKS[i].tag {
- if tag == ltag {
- return true;
- }
- }
- }
- false
-}
-
-#[allow(unused_variables)]
-fn parse_hdrl(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- Ok(0)
-}
-
-#[allow(unused_variables)]
-fn parse_strl(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- Ok(0)
-}
-
-#[allow(unused_variables)]
-fn parse_strh(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if size < 0x38 { return Err(InvalidData); }
- let tag = dmx.src.read_u32be()?; //stream type
- let fcc = dmx.src.read_u32be()?; //handler(fourcc)
- dmx.src.read_u32le()?; //flags
- dmx.src.read_skip(2)?; //priority
- dmx.src.read_skip(2)?; //language
- dmx.src.read_skip(4)?; //initial frames
- dmx.tb_num = dmx.src.read_u32le()?; //scale
- dmx.tb_den = dmx.src.read_u32le()?; //rate
- dmx.src.read_skip(4)?; //start
- dmx.src.read_skip(4)?; //length
- dmx.src.read_skip(4)?; //buf size
- dmx.src.read_skip(4)?; //quality
- dmx.src.read_skip(4)?; //sample size
- let a = dmx.src.read_u16le()?;
- let b = dmx.src.read_u16le()?;
- let c = dmx.src.read_u16le()?;
- let d = dmx.src.read_u16le()?;
-
- dmx.src.read_skip(size - 0x38)?;
-
- if !dmx.sstate.valid_state() || dmx.sstate.strm_no >= dmx.num_streams {
- return Err(InvalidData);
- }
- if tag == mktag!(b"vids") {
- dmx.sstate.strm_type = Some(StreamType::Video);
- } else if tag == mktag!(b"auds") {
- dmx.sstate.strm_type = Some(StreamType::Audio);
- } else {
- dmx.sstate.strm_type = Some(StreamType::Data);
- }
- dmx.sstate.got_strf = false;
-
- Ok(size)
-}
-
-fn parse_strf(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if let None = dmx.sstate.strm_type { return Err(InvalidData); }
- match dmx.sstate.strm_type.unwrap() {
- StreamType::Video => parse_strf_vids(dmx, strmgr, size),
- StreamType::Audio => parse_strf_auds(dmx, strmgr, size),
- _ => parse_strf_xxxx(dmx, strmgr, size),
- }
-}
-
-#[allow(unused_variables)]
-fn parse_strf_vids(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if size < 40 { return Err(InvalidData); }
- let bi_size = dmx.src.read_u32le()?;
- if (bi_size as usize) > size { return Err(InvalidData); }
- let width = dmx.src.read_u32le()?;
- let height = dmx.src.read_u32le()? as i32;
- let planes = dmx.src.read_u16le()?;
- let bitcount = dmx.src.read_u16le()?;
- let mut compression: [u8; 4] = [0; 4];
- dmx.src.read_buf(&mut compression)?;
- let img_size = dmx.src.read_u32le()?;
- let xdpi = dmx.src.read_u32le()?;
- let ydpi = dmx.src.read_u32le()?;
- let colors = dmx.src.read_u32le()?;
- let imp_colors = dmx.src.read_u32le()?;
-
- let flip = height < 0;
- let format = if bitcount > 8 { RGB24_FORMAT } else { PAL8_FORMAT };
- let vhdr = NAVideoInfo::new(width as usize, if flip { -height as usize } else { height as usize}, flip, PAL8_FORMAT);
- let vci = NACodecTypeInfo::Video(vhdr);
- let edata = dmx.read_extradata(size - 40)?;
- let cname = match register::find_codec_from_avi_fourcc(&compression) {
- None => "unknown",
- Some(name) => name,
- };
- let vinfo = NACodecInfo::new(cname, vci, edata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Video, dmx.sstate.strm_no as u32, vinfo, dmx.tb_num, dmx.tb_den));
- if let None = res { return Err(MemoryError); }
- dmx.sstate.reset();
- Ok(size)
-}
-
-#[allow(unused_variables)]
-fn parse_strf_auds(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if size < 16 { return Err(InvalidData); }
- let w_format_tag = dmx.src.read_u16le()?;
- let channels = dmx.src.read_u16le()?;
- let samplespersec = dmx.src.read_u32le()?;
- let avgbytespersec = dmx.src.read_u32le()?;
- let block_align = dmx.src.read_u16le()?;
- let bits_per_sample = dmx.src.read_u16le()? * 8;
-
- let soniton = NASoniton::new(bits_per_sample as u8, SONITON_FLAG_SIGNED);
- let ahdr = NAAudioInfo::new(samplespersec, channels as u8, soniton, block_align as usize);
- let edata = dmx.read_extradata(size - 16)?;
- let cname = match register::find_codec_from_wav_twocc(w_format_tag) {
- None => "unknown",
- Some(name) => name,
- };
- let ainfo = NACodecInfo::new(cname, NACodecTypeInfo::Audio(ahdr), edata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Audio, dmx.sstate.strm_no as u32, ainfo, dmx.tb_num, dmx.tb_den));
- if let None = res { return Err(MemoryError); }
- dmx.sstate.reset();
- Ok(size)
-}
-
-fn parse_strf_xxxx(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- let edata = dmx.read_extradata(size)?;
- let info = NACodecInfo::new("unknown", NACodecTypeInfo::None, edata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Data, dmx.sstate.strm_no as u32, info, dmx.tb_num, dmx.tb_den));
- if let None = res { return Err(MemoryError); }
- dmx.sstate.reset();
- Ok(size)
-}
-
-#[allow(unused_variables)]
-fn parse_avih(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if size < 0x38 { return Err(InvalidData); }
- let timebase = dmx.src.read_u32le()?; //microsec per frame
- dmx.src.read_skip(4)?; //max frame size
- dmx.src.read_skip(4)?; //padding
- dmx.src.read_u32le()?; //flags
- let frames = dmx.src.read_u32le()?; //frames
- dmx.src.read_skip(4)?; //initial frames
- let streams = dmx.src.read_u32le()?; //streams
- if streams > 100 { return Err(InvalidData); }
- dmx.num_streams = streams as u8;
-
- dmx.src.read_skip(4)?; //buf size
- let width = dmx.src.read_u32le()?; //width
- let height = dmx.src.read_u32le()? as i32; //height
- dmx.src.read_skip(16)?; //reserved
-
- dmx.cur_frame.resize(streams as usize, 0);
- dmx.src.read_skip(size - 0x38)?;
- Ok(size)
-}
-
-#[allow(unused_variables)]
-fn parse_junk(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- dmx.src.read_skip(size)?;
- Ok(size)
-}
-
-pub struct AVIDemuxerCreator { }
-
-impl DemuxerCreator for AVIDemuxerCreator {
- fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> {
- Box::new(AVIDemuxer::new(br))
- }
- fn get_name(&self) -> &'static str { "avi" }
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
- use std::fs::File;
-
- #[test]
- fn test_avi_demux() {
- let mut file = File::open("assets/laser05.avi").unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let mut dmx = AVIDemuxer::new(&mut br);
- let mut sm = StreamManager::new();
- dmx.open(&mut sm).unwrap();
-
- loop {
- let pktres = dmx.get_frame(&mut sm);
- if let Err(e) = pktres {
- if e == DemuxerError::EOF { break; }
- panic!("error");
- }
- let pkt = pktres.unwrap();
- println!("Got {}", pkt);
- }
- }
-}
diff --git a/nihav-core/src/demuxers/mod.rs b/nihav-core/src/demuxers/mod.rs
index 56e670d..bfd492a 100644
--- a/nihav-core/src/demuxers/mod.rs
+++ b/nihav-core/src/demuxers/mod.rs
@@ -204,15 +204,6 @@ macro_rules! validate {
($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DemuxerError::InvalidData); } };
}
-#[cfg(feature="demuxer_avi")]
-mod avi;
-
-
-const DEMUXERS: &[&'static DemuxerCreator] = &[
-#[cfg(feature="demuxer_avi")]
- &avi::AVIDemuxerCreator {},
-];
-
pub fn create_demuxer<'a>(dmxcr: &DemuxerCreator, br: &'a mut ByteReader<'a>) -> DemuxerResult<Demuxer<'a>> {
let mut dmx = dmxcr.new_demuxer(br);
let mut str = StreamManager::new();
@@ -239,10 +230,4 @@ impl RegisteredDemuxers {
}
None
}
-}
-
-pub fn core_register_all_demuxers(rd: &mut RegisteredDemuxers) {
- for demuxer in DEMUXERS.into_iter() {
- rd.add_demuxer(*demuxer);
- }
-}
+} \ No newline at end of file