| 1 | use nihav_core::codecs::*; |
| 2 | use nihav_core::io::bitreader::*; |
| 3 | use std::str::FromStr; |
| 4 | use std::sync::Arc; |
| 5 | |
| 6 | const CODEC_SAMPLES: usize = 1152; |
| 7 | |
| 8 | struct QMF { |
| 9 | hist: [f32; 1024], |
| 10 | pos: usize, |
| 11 | } |
| 12 | |
| 13 | macro_rules! butterfly { |
| 14 | (in; $src0: expr, $src1: expr, $dst0: expr, $dst1: expr, $scale: expr) => { |
| 15 | $dst0 = $src0 + $src1; |
| 16 | $dst1 = ($src0 - $src1) * $scale; |
| 17 | }; |
| 18 | (rev; $a: expr, $b: expr) => { |
| 19 | butterfly!(rev; $a, $b, std::f32::consts::FRAC_1_SQRT_2); |
| 20 | }; |
| 21 | (rev; $a: expr, $b: expr, $scale: expr) => { |
| 22 | let tmp = $a + $b; |
| 23 | $b = ($a - $b) * $scale; |
| 24 | $a = tmp; |
| 25 | }; |
| 26 | (scal; $a: expr, $b: expr) => { |
| 27 | butterfly!(scal; $a, $b, std::f32::consts::FRAC_1_SQRT_2); |
| 28 | }; |
| 29 | (scal; $a: expr, $b: expr, $scale: expr) => { |
| 30 | let tmp = $a + $b; |
| 31 | $b = ($b - $a) * $scale; |
| 32 | $a = tmp; |
| 33 | }; |
| 34 | } |
| 35 | |
| 36 | macro_rules! postadd { |
| 37 | ($tmp: expr, $a0: expr, $b0: expr, $c0: expr, $d0: expr, $a1: expr, $b1: expr, $c1: expr, $d1: expr) => { |
| 38 | $tmp[$c0] += $tmp[$d0]; |
| 39 | $tmp[$c1] += $tmp[$d1]; |
| 40 | $tmp[$a1] += $tmp[$c1]; |
| 41 | $tmp[$c1] += $tmp[$b1]; |
| 42 | $tmp[$b1] += $tmp[$d1]; |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | fn dct32(src: &[f32; 32], dst: &mut [f32]) { |
| 47 | let mut tmp = [0.0f32; 32]; |
| 48 | |
| 49 | butterfly!(in; src[ 0], src[31], tmp[ 0], tmp[31], 0.50060299823519627); |
| 50 | butterfly!(in; src[ 1], src[30], tmp[ 1], tmp[30], 0.50547095989754365); |
| 51 | butterfly!(in; src[ 2], src[29], tmp[ 2], tmp[29], 0.51544730992262455); |
| 52 | butterfly!(in; src[ 3], src[28], tmp[ 3], tmp[28], 0.53104259108978413); |
| 53 | butterfly!(in; src[ 4], src[27], tmp[ 4], tmp[27], 0.55310389603444454); |
| 54 | butterfly!(in; src[ 5], src[26], tmp[ 5], tmp[26], 0.58293496820613389); |
| 55 | butterfly!(in; src[ 6], src[25], tmp[ 6], tmp[25], 0.62250412303566482); |
| 56 | butterfly!(in; src[ 7], src[24], tmp[ 7], tmp[24], 0.67480834145500568); |
| 57 | butterfly!(in; src[ 8], src[23], tmp[ 8], tmp[23], 0.74453627100229858); |
| 58 | butterfly!(in; src[ 9], src[22], tmp[ 9], tmp[22], 0.83934964541552681); |
| 59 | butterfly!(in; src[10], src[21], tmp[10], tmp[21], 0.97256823786196078); |
| 60 | butterfly!(in; src[11], src[20], tmp[11], tmp[20], 1.1694399334328847); |
| 61 | butterfly!(in; src[12], src[19], tmp[12], tmp[19], 1.4841646163141662); |
| 62 | butterfly!(in; src[13], src[18], tmp[13], tmp[18], 2.0577810099534108); |
| 63 | butterfly!(in; src[14], src[17], tmp[14], tmp[17], 3.407608418468719); |
| 64 | butterfly!(in; src[15], src[16], tmp[15], tmp[16], 10.190008123548033); |
| 65 | butterfly!(rev; tmp[ 0], tmp[15], 0.50241928618815568); |
| 66 | butterfly!(rev; tmp[ 1], tmp[14], 0.52249861493968885); |
| 67 | butterfly!(rev; tmp[ 2], tmp[13], 0.56694403481635769); |
| 68 | butterfly!(rev; tmp[ 3], tmp[12], 0.64682178335999008); |
| 69 | butterfly!(rev; tmp[ 4], tmp[11], 0.7881546234512502); |
| 70 | butterfly!(rev; tmp[ 5], tmp[10], 1.0606776859903471); |
| 71 | butterfly!(rev; tmp[ 6], tmp[ 9], 1.7224470982383342); |
| 72 | butterfly!(rev; tmp[ 7], tmp[ 8], 5.1011486186891553); |
| 73 | butterfly!(scal; tmp[16], tmp[31], 0.50241928618815568); |
| 74 | butterfly!(scal; tmp[17], tmp[30], 0.52249861493968885); |
| 75 | butterfly!(scal; tmp[18], tmp[29], 0.56694403481635769); |
| 76 | butterfly!(scal; tmp[19], tmp[28], 0.64682178335999008); |
| 77 | butterfly!(scal; tmp[20], tmp[27], 0.7881546234512502); |
| 78 | butterfly!(scal; tmp[21], tmp[26], 1.0606776859903471); |
| 79 | butterfly!(scal; tmp[22], tmp[25], 1.7224470982383342); |
| 80 | butterfly!(scal; tmp[23], tmp[24], 5.1011486186891553); |
| 81 | butterfly!(rev; tmp[ 0], tmp[ 7], 0.50979557910415918); |
| 82 | butterfly!(rev; tmp[ 1], tmp[ 6], 0.60134488693504529); |
| 83 | butterfly!(rev; tmp[ 2], tmp[ 5], 0.89997622313641557); |
| 84 | butterfly!(rev; tmp[ 3], tmp[ 4], 2.5629154477415055); |
| 85 | butterfly!(rev; tmp[16], tmp[23], 0.50979557910415918); |
| 86 | butterfly!(rev; tmp[17], tmp[22], 0.60134488693504529); |
| 87 | butterfly!(rev; tmp[18], tmp[21], 0.89997622313641557); |
| 88 | butterfly!(rev; tmp[19], tmp[20], 2.5629154477415055); |
| 89 | butterfly!(scal; tmp[ 8], tmp[15], 0.50979557910415918); |
| 90 | butterfly!(scal; tmp[ 9], tmp[14], 0.60134488693504529); |
| 91 | butterfly!(scal; tmp[10], tmp[13], 0.89997622313641557); |
| 92 | butterfly!(scal; tmp[11], tmp[12], 2.5629154477415055); |
| 93 | butterfly!(scal; tmp[24], tmp[31], 0.50979557910415918); |
| 94 | butterfly!(scal; tmp[25], tmp[30], 0.60134488693504529); |
| 95 | butterfly!(scal; tmp[26], tmp[29], 0.89997622313641557); |
| 96 | butterfly!(scal; tmp[27], tmp[28], 2.5629154477415055); |
| 97 | butterfly!(rev; tmp[ 0], tmp[ 3], 0.54119610014619701); |
| 98 | butterfly!(rev; tmp[ 1], tmp[ 2], 1.3065629648763764); |
| 99 | butterfly!(rev; tmp[ 8], tmp[11], 0.54119610014619701); |
| 100 | butterfly!(rev; tmp[ 9], tmp[10], 1.3065629648763764); |
| 101 | butterfly!(rev; tmp[16], tmp[19], 0.54119610014619701); |
| 102 | butterfly!(rev; tmp[17], tmp[18], 1.3065629648763764); |
| 103 | butterfly!(rev; tmp[24], tmp[27], 0.54119610014619701); |
| 104 | butterfly!(rev; tmp[25], tmp[26], 1.3065629648763764); |
| 105 | butterfly!(scal; tmp[ 4], tmp[ 7], 0.54119610014619701); |
| 106 | butterfly!(scal; tmp[ 5], tmp[ 6], 1.3065629648763764); |
| 107 | butterfly!(scal; tmp[12], tmp[15], 0.54119610014619701); |
| 108 | butterfly!(scal; tmp[13], tmp[14], 1.3065629648763764); |
| 109 | butterfly!(scal; tmp[20], tmp[23], 0.54119610014619701); |
| 110 | butterfly!(scal; tmp[21], tmp[22], 1.3065629648763764); |
| 111 | butterfly!(scal; tmp[28], tmp[31], 0.54119610014619701); |
| 112 | butterfly!(scal; tmp[29], tmp[30], 1.3065629648763764); |
| 113 | butterfly!(rev; tmp[ 0], tmp[ 1]); |
| 114 | butterfly!(rev; tmp[ 4], tmp[ 5]); |
| 115 | butterfly!(rev; tmp[ 8], tmp[ 9]); |
| 116 | butterfly!(rev; tmp[12], tmp[13]); |
| 117 | butterfly!(rev; tmp[16], tmp[17]); |
| 118 | butterfly!(rev; tmp[20], tmp[21]); |
| 119 | butterfly!(rev; tmp[24], tmp[25]); |
| 120 | butterfly!(rev; tmp[28], tmp[29]); |
| 121 | butterfly!(scal; tmp[ 2], tmp[ 3]); |
| 122 | butterfly!(scal; tmp[ 6], tmp[ 7]); |
| 123 | butterfly!(scal; tmp[10], tmp[11]); |
| 124 | butterfly!(scal; tmp[14], tmp[15]); |
| 125 | butterfly!(scal; tmp[18], tmp[19]); |
| 126 | butterfly!(scal; tmp[22], tmp[23]); |
| 127 | butterfly!(scal; tmp[26], tmp[27]); |
| 128 | butterfly!(scal; tmp[30], tmp[31]); |
| 129 | |
| 130 | postadd!(tmp, 0, 1, 2, 3, 4, 5, 6, 7); |
| 131 | postadd!(tmp, 8, 9, 10, 11, 12, 13, 14, 15); |
| 132 | postadd!(tmp,16, 17, 18, 19, 20, 21, 22, 23); |
| 133 | postadd!(tmp,24, 25, 26, 27, 28, 29, 30, 31); |
| 134 | |
| 135 | dst[ 0] = tmp[0]; |
| 136 | dst[16] = tmp[1]; |
| 137 | dst[ 8] = tmp[2]; |
| 138 | dst[24] = tmp[3]; |
| 139 | dst[ 4] = tmp[4]; |
| 140 | dst[20] = tmp[5]; |
| 141 | dst[12] = tmp[6]; |
| 142 | dst[28] = tmp[7]; |
| 143 | |
| 144 | dst[ 2] = tmp[ 8] + tmp[12]; |
| 145 | dst[18] = tmp[ 9] + tmp[13]; |
| 146 | dst[10] = tmp[10] + tmp[14]; |
| 147 | dst[26] = tmp[11] + tmp[15]; |
| 148 | |
| 149 | dst[ 6] = tmp[12] + tmp[10]; |
| 150 | dst[22] = tmp[13] + tmp[11]; |
| 151 | |
| 152 | dst[14] = tmp[14] + tmp[ 9]; |
| 153 | |
| 154 | dst[30] = tmp[15]; |
| 155 | |
| 156 | tmp[24] += tmp[28]; |
| 157 | tmp[28] += tmp[26]; |
| 158 | tmp[26] += tmp[30]; |
| 159 | tmp[30] += tmp[25]; |
| 160 | tmp[25] += tmp[29]; |
| 161 | tmp[29] += tmp[27]; |
| 162 | tmp[27] += tmp[31]; |
| 163 | |
| 164 | dst[ 1] = tmp[16] + tmp[24]; |
| 165 | dst[17] = tmp[17] + tmp[25]; |
| 166 | dst[ 9] = tmp[18] + tmp[26]; |
| 167 | dst[25] = tmp[19] + tmp[27]; |
| 168 | dst[ 5] = tmp[20] + tmp[28]; |
| 169 | dst[21] = tmp[21] + tmp[29]; |
| 170 | dst[13] = tmp[22] + tmp[30]; |
| 171 | dst[29] = tmp[23] + tmp[31]; |
| 172 | |
| 173 | dst[ 3] = tmp[24] + tmp[20]; |
| 174 | dst[19] = tmp[25] + tmp[21]; |
| 175 | dst[11] = tmp[26] + tmp[22]; |
| 176 | dst[27] = tmp[27] + tmp[23]; |
| 177 | |
| 178 | dst[ 7] = tmp[28] + tmp[18]; |
| 179 | dst[23] = tmp[29] + tmp[19]; |
| 180 | |
| 181 | dst[15] = tmp[30] + tmp[17]; |
| 182 | |
| 183 | dst[31] = tmp[31]; |
| 184 | } |
| 185 | |
| 186 | impl QMF { |
| 187 | fn new() -> Self { |
| 188 | Self { |
| 189 | hist: [0.0; 1024], |
| 190 | pos: 0, |
| 191 | } |
| 192 | } |
| 193 | fn synth(&mut self, src: &[f32; 32], dst: &mut [f32]) { |
| 194 | self.pos = self.pos.wrapping_sub(32) & 0x1FF; |
| 195 | dct32(src, &mut self.hist[self.pos..][..32]); |
| 196 | |
| 197 | for i in 0..16 { |
| 198 | let mut acc = 0.0; |
| 199 | for j in (0..512).step_by(64) { |
| 200 | acc += QMF_WINDOW[i + j] * self.hist[(j + 16 + i + self.pos) & 0x1FF]; |
| 201 | acc -= QMF_WINDOW[i + j + 32] * self.hist[(j + 16 + 32 - i + self.pos) & 0x1FF]; |
| 202 | } |
| 203 | dst[i] = acc; |
| 204 | } |
| 205 | let mut acc = 0.0; |
| 206 | for j in (0..512).step_by(64) { |
| 207 | acc -= QMF_WINDOW[j + 32 + 16] * self.hist[(j + 32 + self.pos) & 0x1FF]; |
| 208 | } |
| 209 | dst[16] = acc; |
| 210 | for i in 17..32 { |
| 211 | let mut acc = 0.0; |
| 212 | for j in (0..512).step_by(64) { |
| 213 | acc -= QMF_WINDOW[i + j] * self.hist[(j + 32 + 16 - i + self.pos) & 0x1FF]; |
| 214 | acc -= QMF_WINDOW[i + j + 32] * self.hist[(j + 32 - 16 + i + self.pos) & 0x1FF]; |
| 215 | } |
| 216 | dst[i] = acc; |
| 217 | } |
| 218 | } |
| 219 | } |
| 220 | |
| 221 | struct LHDecoder { |
| 222 | ainfo: NAAudioInfo, |
| 223 | info: Arc<NACodecInfo>, |
| 224 | chmap: NAChannelMap, |
| 225 | |
| 226 | bitalloc: [[u8; 32]; 3], |
| 227 | scf_select: [u8; 32], |
| 228 | scales: [[u8; 32]; 3], |
| 229 | samples: [[f32; 32]; 36], |
| 230 | |
| 231 | bitpos: u32, |
| 232 | |
| 233 | qmf: QMF, |
| 234 | } |
| 235 | |
| 236 | impl LHDecoder { |
| 237 | fn new() -> Self { |
| 238 | Self { |
| 239 | ainfo: NAAudioInfo::new(22050, 1, SND_F32P_FORMAT, CODEC_SAMPLES), |
| 240 | info: NACodecInfo::new_dummy(), |
| 241 | chmap: NAChannelMap::new(), |
| 242 | |
| 243 | bitalloc: [[0; 32]; 3], |
| 244 | scf_select: [0; 32], |
| 245 | scales: [[0; 32]; 3], |
| 246 | samples: [[0.0; 32]; 36], |
| 247 | |
| 248 | bitpos: 0, |
| 249 | |
| 250 | qmf: QMF::new(), |
| 251 | } |
| 252 | } |
| 253 | fn unpack_bitalloc(&mut self, br: &mut BitReader) -> DecoderResult<()> { |
| 254 | for i in 0..3 { |
| 255 | for sb in 0..32 { |
| 256 | self.bitalloc[i][sb] = br.read(BITALLOC_INFO[sb])? as u8; |
| 257 | } |
| 258 | } |
| 259 | Ok(()) |
| 260 | } |
| 261 | fn unpack_scales(&mut self, br: &mut BitReader) -> DecoderResult<()> { |
| 262 | for sb in 0..32 { |
| 263 | if (self.bitalloc[0][sb] | self.bitalloc[1][sb] | self.bitalloc[2][sb]) != 0 { |
| 264 | self.scf_select[sb] = br.read(2)? as u8; |
| 265 | } else { |
| 266 | self.scf_select[sb] = 0; |
| 267 | } |
| 268 | } |
| 269 | |
| 270 | self.scales = [[0; 32]; 3]; |
| 271 | for sb in 0..32 { |
| 272 | let ba0 = self.bitalloc[0][sb]; |
| 273 | let ba1 = self.bitalloc[1][sb]; |
| 274 | let ba2 = self.bitalloc[2][sb]; |
| 275 | if (ba0 | ba1 | ba2) == 0 { |
| 276 | continue; |
| 277 | } |
| 278 | match self.scf_select[sb] { |
| 279 | 0 => { |
| 280 | for j in 0..3 { |
| 281 | if self.bitalloc[j][sb] != 0 { |
| 282 | self.scales[j][sb] = br.read(6)? as u8; |
| 283 | } |
| 284 | } |
| 285 | }, |
| 286 | 1 => { |
| 287 | if (ba0 | ba1) != 0 { |
| 288 | let scale = br.read(6)? as u8; |
| 289 | self.scales[0][sb] = scale; |
| 290 | self.scales[1][sb] = scale; |
| 291 | } |
| 292 | if ba2 != 0 { |
| 293 | self.scales[2][sb] = br.read(6)? as u8; |
| 294 | } |
| 295 | }, |
| 296 | 2 => { |
| 297 | let scale = br.read(6)? as u8; |
| 298 | self.scales[0][sb] = scale; |
| 299 | self.scales[1][sb] = scale; |
| 300 | self.scales[2][sb] = scale; |
| 301 | }, |
| 302 | _ => { |
| 303 | if ba0 != 0 { |
| 304 | self.scales[0][sb] = br.read(6)? as u8; |
| 305 | } |
| 306 | if (ba1 | ba2) != 0 { |
| 307 | let scale = br.read(6)? as u8; |
| 308 | self.scales[1][sb] = scale; |
| 309 | self.scales[2][sb] = scale; |
| 310 | } |
| 311 | }, |
| 312 | }; |
| 313 | } |
| 314 | Ok(()) |
| 315 | } |
| 316 | fn unpack_samples(&mut self, br: &mut BitReader) -> DecoderResult<()> { |
| 317 | for grp in 0..3 { |
| 318 | for gr in 0..4 { |
| 319 | for sb in 0..32 { |
| 320 | let set = (grp * 4 + gr) * 3; |
| 321 | if self.bitalloc[grp][sb] == 0 { |
| 322 | self.samples[set + 0][sb] = 0.0; |
| 323 | self.samples[set + 1][sb] = 0.0; |
| 324 | self.samples[set + 2][sb] = 0.0; |
| 325 | continue; |
| 326 | } |
| 327 | let idx = sb * 4 + (self.bitalloc[grp][sb] as usize); |
| 328 | let bits = GROUP_BITS[idx]; |
| 329 | let sf = SCALEFACTORS[self.scales[grp][sb] as usize]; |
| 330 | if GROUP_INFO[idx] == 1 { |
| 331 | let radix = (1 << bits) - 1; |
| 332 | let val0 = br.read(bits)? as usize; |
| 333 | let val1 = br.read(bits)? as usize; |
| 334 | let val2 = br.read(bits)? as usize; |
| 335 | self.samples[set + 0][sb] = Self::dequant(val0, idx, radix) * sf; |
| 336 | self.samples[set + 1][sb] = Self::dequant(val1, idx, radix) * sf; |
| 337 | self.samples[set + 2][sb] = Self::dequant(val2, idx, radix) * sf; |
| 338 | } else { |
| 339 | let radix = GROUP_RADIX[idx] as usize; |
| 340 | let val = br.read(bits)? as usize; |
| 341 | let val0 = val % radix; |
| 342 | let val1 = (val / radix) % radix; |
| 343 | let val2 = val / radix / radix; |
| 344 | self.samples[set + 0][sb] = Self::dequant(val0, idx, radix) * sf; |
| 345 | self.samples[set + 1][sb] = Self::dequant(val1, idx, radix) * sf; |
| 346 | self.samples[set + 2][sb] = Self::dequant(val2, idx, radix) * sf; |
| 347 | } |
| 348 | } |
| 349 | } |
| 350 | } |
| 351 | Ok(()) |
| 352 | } |
| 353 | fn dequant(val: usize, idx: usize, radix: usize) -> f32 { |
| 354 | let qval = match radix { |
| 355 | 3 => QUANTS3[val], |
| 356 | 5 => QUANTS5[val], |
| 357 | 7 => QUANTS7[val], |
| 358 | 15 => QUANTS15[val], |
| 359 | 63 => QUANTS63[val], |
| 360 | _ => unreachable!(), |
| 361 | }; |
| 362 | let bias_idx = QUANT_BIAS_MAP[idx] as usize; |
| 363 | (qval + QUANT_BIAS[bias_idx]) / QUANT_RANGE[bias_idx] |
| 364 | } |
| 365 | } |
| 366 | |
| 367 | impl NADecoder for LHDecoder { |
| 368 | fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { |
| 369 | if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { |
| 370 | self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), 1, SND_F32P_FORMAT, CODEC_SAMPLES); |
| 371 | self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone())); |
| 372 | self.chmap = NAChannelMap::from_str("C").unwrap(); |
| 373 | Ok(()) |
| 374 | } else { |
| 375 | Err(DecoderError::InvalidData) |
| 376 | } |
| 377 | } |
| 378 | fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { |
| 379 | let info = pkt.get_stream().get_info(); |
| 380 | if let NACodecTypeInfo::Audio(_) = info.get_properties() { |
| 381 | let pktbuf = pkt.get_buffer(); |
| 382 | |
| 383 | let mut daudio = Vec::with_capacity(CODEC_SAMPLES); |
| 384 | |
| 385 | let mut br = BitReader::new(pktbuf.as_slice(), BitReaderMode::BE); |
| 386 | br.skip(self.bitpos)?; |
| 387 | |
| 388 | while br.left() >= 8 { |
| 389 | self.unpack_bitalloc(&mut br)?; |
| 390 | self.unpack_scales(&mut br)?; |
| 391 | self.unpack_samples(&mut br)?; |
| 392 | |
| 393 | let mut samp_buf = [0.0f32; 32]; |
| 394 | for set in 0..36 { |
| 395 | self.qmf.synth(&self.samples[set], &mut samp_buf); |
| 396 | daudio.extend_from_slice(&samp_buf); |
| 397 | } |
| 398 | } |
| 399 | |
| 400 | self.bitpos = (br.tell() as u32) & 7; |
| 401 | |
| 402 | let abuf = alloc_audio_buffer(self.ainfo, daudio.len(), self.chmap.clone())?; |
| 403 | let mut adata = abuf.get_abuf_f32().unwrap(); |
| 404 | let buf = adata.get_data_mut().unwrap(); |
| 405 | (&mut buf[..daudio.len()]).copy_from_slice(daudio.as_slice()); |
| 406 | |
| 407 | let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf); |
| 408 | frm.set_duration(Some(CODEC_SAMPLES as u64)); |
| 409 | frm.set_keyframe(true); |
| 410 | Ok(frm.into_ref()) |
| 411 | } else { |
| 412 | Err(DecoderError::Bug) |
| 413 | } |
| 414 | } |
| 415 | fn flush(&mut self) { |
| 416 | self.qmf = QMF::new(); |
| 417 | self.bitpos = 0; |
| 418 | } |
| 419 | } |
| 420 | |
| 421 | impl NAOptionHandler for LHDecoder { |
| 422 | fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } |
| 423 | fn set_options(&mut self, _options: &[NAOption]) { } |
| 424 | fn query_option_value(&self, _name: &str) -> Option<NAValue> { None } |
| 425 | } |
| 426 | |
| 427 | pub fn get_decoder() -> Box<dyn NADecoder + Send> { |
| 428 | Box::new(LHDecoder::new()) |
| 429 | } |
| 430 | |
| 431 | const BITALLOC_INFO: [u8; 32] = [ |
| 432 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, |
| 433 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 |
| 434 | ]; |
| 435 | |
| 436 | const GROUP_BITS: [u8; 128] = [ |
| 437 | 0, 3, 4, 6, 0, 3, 4, 6, 0, 3, 4, 6, 0, 3, 4, 6, |
| 438 | 0, 3, 4, 6, 0, 3, 4, 6, 0, 5, 7, 4, 0, 5, 7, 4, |
| 439 | 0, 5, 7, 4, 0, 5, 7, 4, 0, 5, 7, 4, 0, 5, 7, 4, |
| 440 | 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, |
| 441 | 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, |
| 442 | 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, |
| 443 | 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, |
| 444 | 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0 |
| 445 | ]; |
| 446 | const GROUP_INFO: [u8; 128] = [ |
| 447 | 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, |
| 448 | 0, 1, 1, 1, 0, 1, 1, 1, 0, 3, 3, 1, 0, 3, 3, 1, |
| 449 | 0, 3, 3, 1, 0, 3, 3, 1, 0, 3, 3, 1, 0, 3, 3, 1, |
| 450 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, |
| 451 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, |
| 452 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, |
| 453 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, |
| 454 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0 |
| 455 | ]; |
| 456 | const GROUP_RADIX: [u8; 128] = [ |
| 457 | 0, 7, 15, 63, 0, 7, 15, 63, 0, 7, 15, 63, 0, 7, 15, 63, |
| 458 | 0, 7, 15, 63, 0, 7, 15, 63, 0, 3, 5, 15, 0, 3, 5, 15, |
| 459 | 0, 3, 5, 15, 0, 3, 5, 15, 0, 3, 5, 15, 0, 3, 5, 15, |
| 460 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, |
| 461 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, |
| 462 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, |
| 463 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, |
| 464 | 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0 |
| 465 | ]; |
| 466 | |
| 467 | const QUANT_BIAS_MAP: [u8; 128] = [ |
| 468 | 0, 2, 4, 6, 0, 2, 4, 6, 0, 2, 4, 6, 0, 2, 4, 6, |
| 469 | 0, 2, 4, 6, 0, 2, 4, 6, 0, 0, 1, 4, 0, 0, 1, 4, |
| 470 | 0, 0, 1, 4, 0, 0, 1, 4, 0, 0, 1, 4, 0, 0, 1, 4, |
| 471 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 472 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 473 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 474 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 475 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
| 476 | ]; |
| 477 | const QUANT_BIAS: [f32; 17] = [ |
| 478 | 0.5, 0.5, 0.25, 0.5, 0.125, 0.0625, 0.03125, 0.015625, |
| 479 | 0.0078125, 0.00390625, 0.001953125, 0.0009765625, 0.00048828125, |
| 480 | 0.00024414062, 0.00012207031, 0.000061035164, 0.000030517582 |
| 481 | ]; |
| 482 | const QUANT_RANGE: [f32; 17] = [ |
| 483 | 0.75, 0.625, 0.875, 0.5625, 0.9375, 0.96875, 0.984375, |
| 484 | 0.9921875, 0.99609375, 0.99804688, 0.99902344, 0.99951172, |
| 485 | 0.99975586, 0.99987793, 0.99993896, 0.99996948, 0.99998474 |
| 486 | ]; |
| 487 | const SCALEFACTORS: [f32; 64] = [ |
| 488 | 2.0, 1.587401, 1.2599211, 1.0, 0.79370052, 0.62996054, |
| 489 | 0.5, 0.39685026, 0.31498027, 0.25, 0.19842513, 0.15749013, |
| 490 | 0.125, 0.099212565, 0.078745067, 0.0625, 0.049606282, 0.039372534, |
| 491 | 0.03125, 0.024803141, 0.019686267, 0.015625, 0.012401571, 0.0098431334, |
| 492 | 0.0078125, 0.0062007853, 0.0049215667, 0.00390625, 0.0031003926, 0.0024607833, |
| 493 | 0.001953125, 0.0015501963, 0.0012303917, 0.0009765625, 0.00077509816, 0.00061519584, |
| 494 | 0.00048828125, 0.00038754908, 0.00030759792, 0.00024414062, 0.00019377454, 0.00015379896, |
| 495 | 0.00012207031, 0.00009688727, 0.00007689948, 0.000061035156, |
| 496 | 0.000048443635, 0.00003844974, 0.000030517578, 0.000024221818, |
| 497 | 0.00001922487, 0.000015258789, 0.000012110909, 0.000009612435, |
| 498 | 0.0000076293945, 0.0000060554544, 0.0000048062175, 0.0000038146973, |
| 499 | 0.0000030277272, 0.0000024031087, 0.0000019073486, 0.0000015138636, |
| 500 | 0.0000012015544, 9.9999997e-21 |
| 501 | ]; |
| 502 | |
| 503 | const QUANTS3: [f32; 4] = [ -1.0, -0.5, 0.0, 0.5 ]; |
| 504 | const QUANTS5: [f32; 6] = [ -1.0, -0.75, -0.5, -0.25, 0.0, 0.25 ]; |
| 505 | const QUANTS7: [f32; 8] = [ -1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75 ]; |
| 506 | const QUANTS15: [f32; 16] = [ |
| 507 | -1.0, -0.875, -0.75, -0.625, -0.5, -0.375, -0.25, -0.125, |
| 508 | 0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875 ]; |
| 509 | const QUANTS63: [f32; 64] = [ |
| 510 | -1.0, -0.96875, -0.9375, -0.90625, -0.875, -0.84375, -0.8125, -0.78125, |
| 511 | -0.75, -0.71875, -0.6875, -0.65625, -0.625, -0.59375, -0.5625, -0.53125, |
| 512 | -0.5, -0.46875, -0.4375, -0.40625, -0.375, -0.34375, -0.3125, -0.28125, |
| 513 | -0.25, -0.21875, -0.1875, -0.15625, -0.125, -0.09375, -0.0625, -0.03125, |
| 514 | 0.0, 0.03125, 0.0625, 0.09375, 0.125, 0.15625, 0.1875, 0.21875, |
| 515 | 0.25, 0.28125, 0.3125, 0.34375, 0.375, 0.40625, 0.4375, 0.46875, |
| 516 | 0.5, 0.53125, 0.5625, 0.59375, 0.625, 0.65625, 0.6875, 0.71875, |
| 517 | 0.75, 0.78125, 0.8125, 0.84375, 0.875, 0.90625, 0.9375, 0.96875 ]; |
| 518 | |
| 519 | const QMF_WINDOW: [f32; 512] = [ |
| 520 | 0.000000000, -0.000015259, -0.000015259, -0.000015259, |
| 521 | -0.000015259, -0.000015259, -0.000015259, -0.000030518, |
| 522 | -0.000030518, -0.000030518, -0.000030518, -0.000045776, |
| 523 | -0.000045776, -0.000061035, -0.000061035, -0.000076294, |
| 524 | -0.000076294, -0.000091553, -0.000106812, -0.000106812, |
| 525 | -0.000122070, -0.000137329, -0.000152588, -0.000167847, |
| 526 | -0.000198364, -0.000213623, -0.000244141, -0.000259399, |
| 527 | -0.000289917, -0.000320435, -0.000366211, -0.000396729, |
| 528 | -0.000442505, -0.000473022, -0.000534058, -0.000579834, |
| 529 | -0.000625610, -0.000686646, -0.000747681, -0.000808716, |
| 530 | -0.000885010, -0.000961304, -0.001037598, -0.001113892, |
| 531 | -0.001205444, -0.001296997, -0.001388550, -0.001480103, |
| 532 | -0.001586914, -0.001693726, -0.001785278, -0.001907349, |
| 533 | -0.002014160, -0.002120972, -0.002243042, -0.002349854, |
| 534 | -0.002456665, -0.002578735, -0.002685547, -0.002792358, |
| 535 | -0.002899170, -0.002990723, -0.003082275, -0.003173828, |
| 536 | 0.003250122, 0.003326416, 0.003387451, 0.003433228, |
| 537 | 0.003463745, 0.003479004, 0.003479004, 0.003463745, |
| 538 | 0.003417969, 0.003372192, 0.003280640, 0.003173828, |
| 539 | 0.003051758, 0.002883911, 0.002700806, 0.002487183, |
| 540 | 0.002227783, 0.001937866, 0.001617432, 0.001266479, |
| 541 | 0.000869751, 0.000442505, -0.000030518, -0.000549316, |
| 542 | -0.001098633, -0.001693726, -0.002334595, -0.003005981, |
| 543 | -0.003723145, -0.004486084, -0.005294800, -0.006118774, |
| 544 | -0.007003784, -0.007919312, -0.008865356, -0.009841919, |
| 545 | -0.010848999, -0.011886597, -0.012939453, -0.014022827, |
| 546 | -0.015121460, -0.016235352, -0.017349243, -0.018463135, |
| 547 | -0.019577026, -0.020690918, -0.021789551, -0.022857666, |
| 548 | -0.023910522, -0.024932861, -0.025909424, -0.026840210, |
| 549 | -0.027725220, -0.028533936, -0.029281616, -0.029937744, |
| 550 | -0.030532837, -0.031005859, -0.031387329, -0.031661987, |
| 551 | -0.031814575, -0.031845093, -0.031738281, -0.031478882, |
| 552 | 0.031082153, 0.030517578, 0.029785156, 0.028884888, |
| 553 | 0.027801514, 0.026535034, 0.025085449, 0.023422241, |
| 554 | 0.021575928, 0.019531250, 0.017257690, 0.014801025, |
| 555 | 0.012115479, 0.009231567, 0.006134033, 0.002822876, |
| 556 | -0.000686646, -0.004394531, -0.008316040, -0.012420654, |
| 557 | -0.016708374, -0.021179199, -0.025817871, -0.030609131, |
| 558 | -0.035552979, -0.040634155, -0.045837402, -0.051132202, |
| 559 | -0.056533813, -0.061996460, -0.067520142, -0.073059082, |
| 560 | -0.078628540, -0.084182739, -0.089706421, -0.095169067, |
| 561 | -0.100540161, -0.105819702, -0.110946655, -0.115921021, |
| 562 | -0.120697021, -0.125259399, -0.129562378, -0.133590698, |
| 563 | -0.137298584, -0.140670776, -0.143676758, -0.146255493, |
| 564 | -0.148422241, -0.150115967, -0.151306152, -0.151962280, |
| 565 | -0.152069092, -0.151596069, -0.150497437, -0.148773193, |
| 566 | -0.146362305, -0.143264771, -0.139450073, -0.134887695, |
| 567 | -0.129577637, -0.123474121, -0.116577148, -0.108856201, |
| 568 | 0.100311279, 0.090927124, 0.080688477, 0.069595337, |
| 569 | 0.057617187, 0.044784546, 0.031082153, 0.016510010, |
| 570 | 0.001068115, -0.015228271, -0.032379150, -0.050354004, |
| 571 | -0.069168091, -0.088775635, -0.109161377, -0.130310059, |
| 572 | -0.152206421, -0.174789429, -0.198059082, -0.221984863, |
| 573 | -0.246505737, -0.271591187, -0.297210693, -0.323318481, |
| 574 | -0.349868774, -0.376800537, -0.404083252, -0.431655884, |
| 575 | -0.459472656, -0.487472534, -0.515609741, -0.543823242, |
| 576 | -0.572036743, -0.600219727, -0.628295898, -0.656219482, |
| 577 | -0.683914185, -0.711318970, -0.738372803, -0.765029907, |
| 578 | -0.791213989, -0.816864014, -0.841949463, -0.866363525, |
| 579 | -0.890090942, -0.913055420, -0.935195923, -0.956481934, |
| 580 | -0.976852417, -0.996246338, -1.014617920, -1.031936646, |
| 581 | -1.048156738, -1.063217163, -1.077117920, -1.089782715, |
| 582 | -1.101211548, -1.111373901, -1.120223999, -1.127746582, |
| 583 | -1.133926392, -1.138763428, -1.142211914, -1.144287109, |
| 584 | 1.144989014, 1.144287109, 1.142211914, 1.138763428, |
| 585 | 1.133926392, 1.127746582, 1.120223999, 1.111373901, |
| 586 | 1.101211548, 1.089782715, 1.077117920, 1.063217163, |
| 587 | 1.048156738, 1.031936646, 1.014617920, 0.996246338, |
| 588 | 0.976852417, 0.956481934, 0.935195923, 0.913055420, |
| 589 | 0.890090942, 0.866363525, 0.841949463, 0.816864014, |
| 590 | 0.791213989, 0.765029907, 0.738372803, 0.711318970, |
| 591 | 0.683914185, 0.656219482, 0.628295898, 0.600219727, |
| 592 | 0.572036743, 0.543823242, 0.515609741, 0.487472534, |
| 593 | 0.459472656, 0.431655884, 0.404083252, 0.376800537, |
| 594 | 0.349868774, 0.323318481, 0.297210693, 0.271591187, |
| 595 | 0.246505737, 0.221984863, 0.198059082, 0.174789429, |
| 596 | 0.152206421, 0.130310059, 0.109161377, 0.088775635, |
| 597 | 0.069168091, 0.050354004, 0.032379150, 0.015228271, |
| 598 | -0.001068115, -0.016510010, -0.031082153, -0.044784546, |
| 599 | -0.057617187, -0.069595337, -0.080688477, -0.090927124, |
| 600 | 0.100311279, 0.108856201, 0.116577148, 0.123474121, |
| 601 | 0.129577637, 0.134887695, 0.139450073, 0.143264771, |
| 602 | 0.146362305, 0.148773193, 0.150497437, 0.151596069, |
| 603 | 0.152069092, 0.151962280, 0.151306152, 0.150115967, |
| 604 | 0.148422241, 0.146255493, 0.143676758, 0.140670776, |
| 605 | 0.137298584, 0.133590698, 0.129562378, 0.125259399, |
| 606 | 0.120697021, 0.115921021, 0.110946655, 0.105819702, |
| 607 | 0.100540161, 0.095169067, 0.089706421, 0.084182739, |
| 608 | 0.078628540, 0.073059082, 0.067520142, 0.061996460, |
| 609 | 0.056533813, 0.051132202, 0.045837402, 0.040634155, |
| 610 | 0.035552979, 0.030609131, 0.025817871, 0.021179199, |
| 611 | 0.016708374, 0.012420654, 0.008316040, 0.004394531, |
| 612 | 0.000686646, -0.002822876, -0.006134033, -0.009231567, |
| 613 | -0.012115479, -0.014801025, -0.017257690, -0.019531250, |
| 614 | -0.021575928, -0.023422241, -0.025085449, -0.026535034, |
| 615 | -0.027801514, -0.028884888, -0.029785156, -0.030517578, |
| 616 | 0.031082153, 0.031478882, 0.031738281, 0.031845093, |
| 617 | 0.031814575, 0.031661987, 0.031387329, 0.031005859, |
| 618 | 0.030532837, 0.029937744, 0.029281616, 0.028533936, |
| 619 | 0.027725220, 0.026840210, 0.025909424, 0.024932861, |
| 620 | 0.023910522, 0.022857666, 0.021789551, 0.020690918, |
| 621 | 0.019577026, 0.018463135, 0.017349243, 0.016235352, |
| 622 | 0.015121460, 0.014022827, 0.012939453, 0.011886597, |
| 623 | 0.010848999, 0.009841919, 0.008865356, 0.007919312, |
| 624 | 0.007003784, 0.006118774, 0.005294800, 0.004486084, |
| 625 | 0.003723145, 0.003005981, 0.002334595, 0.001693726, |
| 626 | 0.001098633, 0.000549316, 0.000030518, -0.000442505, |
| 627 | -0.000869751, -0.001266479, -0.001617432, -0.001937866, |
| 628 | -0.002227783, -0.002487183, -0.002700806, -0.002883911, |
| 629 | -0.003051758, -0.003173828, -0.003280640, -0.003372192, |
| 630 | -0.003417969, -0.003463745, -0.003479004, -0.003479004, |
| 631 | -0.003463745, -0.003433228, -0.003387451, -0.003326416, |
| 632 | 0.003250122, 0.003173828, 0.003082275, 0.002990723, |
| 633 | 0.002899170, 0.002792358, 0.002685547, 0.002578735, |
| 634 | 0.002456665, 0.002349854, 0.002243042, 0.002120972, |
| 635 | 0.002014160, 0.001907349, 0.001785278, 0.001693726, |
| 636 | 0.001586914, 0.001480103, 0.001388550, 0.001296997, |
| 637 | 0.001205444, 0.001113892, 0.001037598, 0.000961304, |
| 638 | 0.000885010, 0.000808716, 0.000747681, 0.000686646, |
| 639 | 0.000625610, 0.000579834, 0.000534058, 0.000473022, |
| 640 | 0.000442505, 0.000396729, 0.000366211, 0.000320435, |
| 641 | 0.000289917, 0.000259399, 0.000244141, 0.000213623, |
| 642 | 0.000198364, 0.000167847, 0.000152588, 0.000137329, |
| 643 | 0.000122070, 0.000106812, 0.000106812, 0.000091553, |
| 644 | 0.000076294, 0.000076294, 0.000061035, 0.000061035, |
| 645 | 0.000045776, 0.000045776, 0.000030518, 0.000030518, |
| 646 | 0.000030518, 0.000030518, 0.000015259, 0.000015259, |
| 647 | 0.000015259, 0.000015259, 0.000015259, 0.000015259, |
| 648 | ]; |