2 use std::cell::RefCell;
3 use nihav_core::formats::*;
4 use nihav_core::frame::*;
5 use nihav_core::codecs::*;
6 use nihav_core::dsp::fft::FFTMode;
7 use nihav_core::dsp::mdct::IMDCT;
8 use nihav_core::io::bitreader::*;
9 use nihav_core::io::byteio::{ByteReader, MemoryReader};
10 use nihav_core::io::codebook::*;
11 use nihav_core::io::intcode::*;
15 #[derive(Debug,Clone,Copy,PartialEq)]
23 fn get_channels(&self) -> usize {
31 struct CookBookReader {
33 codes: &'static [u16],
35 impl CodebookDescReader<u16> for CookBookReader {
36 fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
37 fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
38 fn sym (&mut self, idx: usize) -> u16 { idx as u16 }
39 fn len(&mut self) -> usize { self.bits.len() }
43 cpl_cb: [Codebook<u16>; 5],
44 quant_cb: Vec<Codebook<u16>>,
45 vq_cb: [Codebook<u16>; 7],
50 let mut cpl0 = CookBookReader { codes: COOK_CPL_2BITS_CODES, bits: COOK_CPL_2BITS_BITS };
51 let mut cpl1 = CookBookReader { codes: COOK_CPL_3BITS_CODES, bits: COOK_CPL_3BITS_BITS };
52 let mut cpl2 = CookBookReader { codes: COOK_CPL_4BITS_CODES, bits: COOK_CPL_4BITS_BITS };
53 let mut cpl3 = CookBookReader { codes: COOK_CPL_5BITS_CODES, bits: COOK_CPL_5BITS_BITS };
54 let mut cpl4 = CookBookReader { codes: COOK_CPL_6BITS_CODES, bits: COOK_CPL_6BITS_BITS };
55 let cpl_cb = [Codebook::new(&mut cpl0, CodebookMode::MSB).unwrap(),
56 Codebook::new(&mut cpl1, CodebookMode::MSB).unwrap(),
57 Codebook::new(&mut cpl2, CodebookMode::MSB).unwrap(),
58 Codebook::new(&mut cpl3, CodebookMode::MSB).unwrap(),
59 Codebook::new(&mut cpl4, CodebookMode::MSB).unwrap()];
60 let mut quant_cb: Vec<Codebook<u16>> = Vec::with_capacity(COOK_QUANT_CODES.len());
61 for i in 0..COOK_QUANT_CODES.len() {
62 let mut quant = CookBookReader { codes: COOK_QUANT_CODES[i], bits: COOK_QUANT_BITS[i] };
63 quant_cb.push(Codebook::new(&mut quant, CodebookMode::MSB).unwrap());
65 let mut vq0 = CookBookReader { codes: COOK_VQ0_CODES, bits: COOK_VQ0_BITS };
66 let mut vq1 = CookBookReader { codes: COOK_VQ1_CODES, bits: COOK_VQ1_BITS };
67 let mut vq2 = CookBookReader { codes: COOK_VQ2_CODES, bits: COOK_VQ2_BITS };
68 let mut vq3 = CookBookReader { codes: COOK_VQ3_CODES, bits: COOK_VQ3_BITS };
69 let mut vq4 = CookBookReader { codes: COOK_VQ4_CODES, bits: COOK_VQ4_BITS };
70 let mut vq5 = CookBookReader { codes: COOK_VQ5_CODES, bits: COOK_VQ5_BITS };
71 let mut vq6 = CookBookReader { codes: COOK_VQ6_CODES, bits: COOK_VQ6_BITS };
72 let vq_cb = [Codebook::new(&mut vq0, CodebookMode::MSB).unwrap(),
73 Codebook::new(&mut vq1, CodebookMode::MSB).unwrap(),
74 Codebook::new(&mut vq2, CodebookMode::MSB).unwrap(),
75 Codebook::new(&mut vq3, CodebookMode::MSB).unwrap(),
76 Codebook::new(&mut vq4, CodebookMode::MSB).unwrap(),
77 Codebook::new(&mut vq5, CodebookMode::MSB).unwrap(),
78 Codebook::new(&mut vq6, CodebookMode::MSB).unwrap()];
98 fn new(samples: usize) -> Self {
99 let fsamples = samples as f32;
100 let mut window: [f32; 1024] = [0.0; 1024];
101 let factor = consts::PI / (2.0 * fsamples);
102 let scale = (2.0 / fsamples).sqrt() / 32768.0;
103 for k in 0..samples {
104 window[k] = (factor * ((k as f32) + 0.5)).sin() * scale;
106 let mut pow_tab: [f32; 128] = [0.0; 128];
107 let mut hpow_tab: [f32; 128] = [0.0; 128];
109 pow_tab[i] = 2.0f32.powf((i as f32) - 64.0);
110 hpow_tab[i] = 2.0f32.powf(((i as f32) - 64.0) * 0.5);
112 let mut gain_tab: [f32; 23] = [0.0; 23];
114 gain_tab[i] = pow_tab[i + 53].powf(8.0 / fsamples);
117 CookDSP { imdct: IMDCT::new(FFTMode::SplitRadix, samples*2, false), window: window, out: [0.0; 2048], size, pow_tab, hpow_tab, gain_tab }
122 fn clip_cat(&self) -> usize;
125 impl ClipCat for i32 {
126 fn clip_cat(&self) -> usize { ((*self).max(0) as usize).min(NUM_CATEGORIES - 1) }
129 const BAND_SIZE: usize = 20;
130 const MAX_SAMPLES: usize = MAX_SUBBANDS * BAND_SIZE;
131 const MAX_PAIRS: usize = 5;
132 const MAX_SUBBANDS: usize = 52;
133 const NUM_CATEGORIES: usize = 8;
135 #[derive(Clone,Copy)]
136 struct CookChannelPair {
145 decouple: [u8; BAND_SIZE],
146 category: [u8; MAX_SUBBANDS * 2],
148 block: [[f32; MAX_SAMPLES * 2]; 2],
149 delay: [[f32; MAX_SAMPLES]; 2],
150 gains: [[i32; 9]; 2],
151 prev_gains: [[i32; 9]; 2],
152 qindex: [i8; MAX_SUBBANDS * 2],
155 impl CookChannelPair {
166 decouple: [0; BAND_SIZE],
167 category: [0; MAX_SUBBANDS * 2],
169 block: [[0.0; MAX_SAMPLES * 2]; 2],
170 delay: [[0.0; MAX_SAMPLES]; 2],
172 prev_gains: [[0; 9]; 2],
173 qindex: [0; MAX_SUBBANDS * 2],
176 fn read_hdr_v1(&mut self, br: &mut ByteReader) -> DecoderResult<()> {
177 let ver = br.read_u32be()?;
178 let micro_ver = ver & 0xFF;
179 self.samples = br.read_u16be()? as usize;
180 validate!(self.samples > 0 && ((self.samples & (self.samples - 1)) == 0));
181 self.subbands = br.read_u16be()? as usize;
182 validate!(self.subbands <= MAX_SUBBANDS);
185 self.mode = Mode::Mono;
190 self.mode = Mode::Stereo;
195 self.mode = Mode::JointStereo;
196 let _delay = br.read_u32be()?;
197 self.js_start = br.read_u16be()? as usize;
198 self.js_bits = br.read_u16be()? as u8;
199 validate!(self.js_start < MAX_SUBBANDS);
200 validate!((self.js_bits >= 2) && (self.js_bits <= 6));
202 _ => { return Err(DecoderError::InvalidData);}
206 fn read_hdr_v2(&mut self, br: &mut ByteReader) -> DecoderResult<u32> {
207 let ver = br.read_u32be()?;
208 validate!((ver >> 24) == 2);
209 self.samples = br.read_u16be()? as usize;
210 self.subbands = br.read_u16be()? as usize;
211 validate!(self.subbands <= MAX_SUBBANDS);
212 let _delay = br.read_u32be()?;
213 self.js_start = br.read_u16be()? as usize;
214 validate!(self.js_start < MAX_SUBBANDS);
215 let js_bits = br.read_u16be()?;
216 let chmap = br.read_u32be()?;
217 if chmap.count_ones() == 1 {
219 self.mode = Mode::Mono;
221 validate!((js_bits >= 2) && (js_bits <= 6));
222 self.js_bits = js_bits as u8;
223 self.mode = Mode::JointStereo;
227 fn bitalloc(&mut self, num_vectors: usize, bits: usize) {
228 let avail_bits = (if bits > self.samples { self.samples + ((bits - self.samples) * 5) / 8 } else { bits }) as i32;
229 let total_subbands = self.subbands + self.js_start;
231 let mut bias: i32 = -32;
234 for j in 0..total_subbands {
235 let idx = ((32 >> i) + bias - (self.qindex[j] as i32)) / 2;
236 sum += COOK_EXP_BITS[idx.clip_cat()];
238 if sum >= (avail_bits - 32) {
243 let mut exp_index1: [usize; MAX_SUBBANDS * 2] = [0; MAX_SUBBANDS * 2];
244 let mut exp_index2: [usize; MAX_SUBBANDS * 2] = [0; MAX_SUBBANDS * 2];
246 for i in 0..total_subbands {
247 let idx = ((bias - (self.qindex[i] as i32)) / 2).clip_cat();
248 sum += COOK_EXP_BITS[idx];
253 let mut tbias1 = sum;
254 let mut tbias2 = sum;
255 let mut tcat: [usize; 128*2] = [0; 128*2];
256 let mut tcat_idx1 = 128;
257 let mut tcat_idx2 = 128;
258 for _ in 1..(1 << self.vector_bits) {
259 if tbias1 + tbias2 > avail_bits * 2 {
260 let mut max = -999999;
261 let mut idx = total_subbands + 1;
262 for j in 0..total_subbands {
263 if exp_index1[j] >= (NUM_CATEGORIES - 1) { continue; }
264 let t = -2 * (exp_index1[j] as i32) - (self.qindex[j] as i32) + bias;
270 if idx >= total_subbands { break; }
271 tcat[tcat_idx1] = idx;
273 tbias1 -= COOK_EXP_BITS[exp_index1[idx]] - COOK_EXP_BITS[exp_index1[idx] + 1];
274 exp_index1[idx] += 1;
276 let mut min = 999999;
277 let mut idx = total_subbands + 1;
278 for j in 0..total_subbands {
279 if exp_index2[j] == 0 { continue; }
280 let t = -2 * (exp_index2[j] as i32) - (self.qindex[j] as i32) + bias;
286 if idx >= total_subbands { break; }
288 tcat[tcat_idx2] = idx;
289 tbias2 -= COOK_EXP_BITS[exp_index2[idx]] - COOK_EXP_BITS[exp_index2[idx] - 1];
290 exp_index2[idx] -= 1;
293 for i in 0..total_subbands {
294 self.category[i] = exp_index2[i] as u8;
297 for _ in 0..num_vectors {
298 let idx = tcat[tcat_idx2];
300 self.category[idx] = (self.category[idx] + 1).min((NUM_CATEGORIES - 1) as u8) as u8;
303 fn decode_channel_data(&mut self, dsp: &mut CookDSP, rnd: &mut RND, codebooks: &Codebooks, src: &[u8], buf: &mut [u8], channel: usize) -> DecoderResult<()> {
305 for (i, b) in src.iter().enumerate() {
306 buf[i] = b ^ COOK_XOR_KEY[i & 3];
308 let mut br = BitReader::new(buf, src.len(), BitReaderMode::BE);
310 let num_gains = br.read_code(UintCodeType::UnaryOnes)? as usize;
311 validate!(num_gains <= 8);
313 swap(&mut self.gains[channel], &mut self.prev_gains[channel]);
314 self.block[channel] = [0.0; MAX_SAMPLES * 2];
318 for _ in 0..num_gains {
319 let idx = br.read(3)? as usize;
322 val = (br.read(4)? as i32) - 7;
326 validate!(idx >= ipos);
328 self.prev_gains[channel][ipos] = val;
333 self.prev_gains[channel][ipos] = 0;
337 // coupling information
338 if self.mode == Mode::JointStereo {
339 let cstart = COOK_CPL_BAND[self.js_start] as usize;
340 let cend = COOK_CPL_BAND[self.subbands - 1] as usize;
342 let cb = &codebooks.cpl_cb[(self.js_bits - 2) as usize];
343 for i in cstart..cend+1 {
344 self.decouple[i] = br.read_cb(cb)? as u8;
347 for i in cstart..cend+1 {
348 self.decouple[i] = br.read(self.js_bits)? as u8;
354 let tot_subbands = self.subbands + self.js_start;
355 self.qindex[0] = (br.read(6)? as i8) - 6;
356 for i in 1..tot_subbands {
358 if pos >= self.js_start * 2 {
359 pos -= self.js_start;
363 let ipos = ((pos as i8) - 1).max(0).min(12);
364 let cb = &codebooks.quant_cb[ipos as usize];
365 self.qindex[i] = (br.read_cb(cb)? as i8) + self.qindex[i - 1] - 12;
366 validate!((self.qindex[i] >= -63) && (self.qindex[i] <= 63));
368 let num_vectors = br.read(self.vector_bits)? as usize;
369 self.bitalloc(num_vectors, br.left() as usize);
372 self.block[channel] = [0.0; MAX_SAMPLES * 2];
374 for sb in 0..tot_subbands {
375 let mut coef_index: [u8; BAND_SIZE] = [0; BAND_SIZE];
376 let mut coef_sign: [bool; BAND_SIZE] = [false; BAND_SIZE];
377 let cat = self.category[sb] as usize;
378 if (cat < NUM_CATEGORIES - 1) && br.left() > 0 {
379 unpack_band(&mut br, codebooks, &mut coef_index, &mut coef_sign, cat)?;
381 for i in 0..BAND_SIZE {
383 if coef_index[i] == 0 {
384 let v = COOK_DITHER_TAB[cat];
385 val = if !rnd.get_sign() { v } else { -v };
387 let v = COOK_QUANT_CENTROID[cat][coef_index[i] as usize];
388 val = if !coef_sign[i] { v } else { -v };
390 self.block[channel][off + i] = val * dsp.hpow_tab[(self.qindex[sb] + 64) as usize];
397 fn decode(&mut self, dsp: &mut CookDSP, rnd: &mut RND, codebooks: &Codebooks, src: &[u8], buf: &mut [u8], abuf: &mut NABufferType) -> DecoderResult<()> {
398 if self.mode == Mode::Stereo {
399 let mut schunk = src.chunks(src.len() / 2);
400 self.decode_channel_data(dsp, rnd, codebooks, schunk.next().unwrap(), buf, 0)?;
401 self.decode_channel_data(dsp, rnd, codebooks, schunk.next().unwrap(), buf, 1)?;
403 self.decode_channel_data(dsp, rnd, codebooks, src, buf, 0)?;
405 // uncouple joint stereo channels
406 if self.mode == Mode::JointStereo {
407 for i in 0..self.js_start {
408 for j in 0..BAND_SIZE {
409 self.block[1][i * BAND_SIZE + j] = self.block[0][(i * 2 + 1) * BAND_SIZE + j];
410 self.block[0][i * BAND_SIZE + j] = self.block[0][(i * 2) * BAND_SIZE + j];
413 let scale_idx = (self.js_bits as usize) - 2;
414 let scale_off = (1 << self.js_bits) as usize;
415 for i in self.js_start..self.subbands {
416 let idx = self.decouple[COOK_CPL_BAND[i] as usize] as usize;
417 let doff = i * BAND_SIZE;
418 let soff = (i + self.js_start) * BAND_SIZE;
419 let m1 = COOK_CPL_SCALES[scale_idx][ 1 + idx];
420 let m2 = COOK_CPL_SCALES[scale_idx][scale_off - 1 - idx];
421 for j in 0..BAND_SIZE {
422 self.block[0][doff + j] = self.block[0][soff + j] * m1;
423 self.block[1][doff + j] = self.block[0][soff + j] * m2;
426 for i in (self.subbands * BAND_SIZE)..MAX_SAMPLES {
427 self.block[0][i] = 0.0;
428 self.block[1][i] = 0.0;
430 self.gains[1] = self.gains[0];
431 self.prev_gains[1] = self.prev_gains[0];
433 for ch in 0..self.mode.get_channels() {
434 let off = abuf.get_offset(ch + self.start_ch);
435 let mut adata = abuf.get_abuf_f32().unwrap();
436 let mut output = adata.get_data_mut();
437 let dst = &mut output[off..];
439 dsp.imdct.imdct(&self.block[ch], &mut dsp.out);
441 let prev_gain = dsp.pow_tab[(self.prev_gains[ch][0] + 64) as usize];
442 let mut cur_gain = 0.0;
443 let mut cur_gain2 = 0.0;
444 let mut gain_idx = 0;
445 let eighthmask = (self.samples >> 3) - 1;
446 for (i, out) in dst.iter_mut().take(self.samples).enumerate() {
447 *out = dsp.out[i + self.samples] * prev_gain * dsp.window[i]
448 - self.delay[ch][i] * dsp.window[self.samples - i - 1];
449 if (i & eighthmask) == 0 {
450 if (self.gains[ch][gain_idx] == 0) && (self.gains[ch][gain_idx + 1] == 0) {
454 cur_gain = dsp.pow_tab[(self.gains[ch][gain_idx] + 64) as usize];
455 cur_gain2 = dsp.gain_tab[(self.gains[ch][gain_idx + 1] - self.gains[ch][gain_idx] + 11) as usize];
460 cur_gain *= cur_gain2;
462 for i in 0..self.samples { self.delay[ch][i] = dsp.out[i]; }
468 const COOK_VQ_GROUP_SIZE: [usize; 7] = [ 2, 2, 2, 4, 4, 5, 5 ];
469 const COOK_NUM_VQ_GROUPS: [usize; 7] = [ 10, 10, 10, 5, 5, 4, 4 ];
470 const COOK_VQ_INV_RADIX: [u32; 7] = [ 74899, 104858, 149797, 209716, 262144, 349526, 524288 ];
471 const COOK_VQ_MULT: [u32; 7] = [ 13, 9, 6, 4, 3, 2, 1 ];
472 fn unpack_band(br: &mut BitReader, codebooks: &Codebooks, coef_index: &mut [u8; BAND_SIZE], coef_sign: &mut [bool; BAND_SIZE], cat: usize) -> DecoderResult<()> {
473 let cb = &codebooks.vq_cb[cat];
474 let group_size = COOK_VQ_GROUP_SIZE[cat];
475 let mult = COOK_VQ_MULT[cat] + 1;
476 for i in 0..COOK_NUM_VQ_GROUPS[cat] {
477 let ret = br.read_cb(cb);
482 let left = br.left() as u32;
487 for j in (0..group_size).rev() {
488 let t = (val * COOK_VQ_INV_RADIX[cat]) >> 20;
489 coef_index[i * group_size + j] = (val - t * mult) as u8;
490 if coef_index[i * group_size + j] != 0 {
495 if (br.left() as usize) < nnz {
496 let left = br.left() as u32;
500 for j in 0..group_size {
501 if coef_index[i * group_size + j] != 0 {
502 coef_sign[i * group_size + j] = br.read_bool()?;
504 coef_sign[i * group_size + j] = false;
517 Self { state: 0xC0DECC00 }
519 fn get_sign(&mut self) -> bool {
520 self.state = (self.state & 0xFFFF).wrapping_mul(36969).wrapping_add(self.state >> 16);
521 (self.state & 0x10000) != 0
526 info: Rc<NACodecInfo>,
530 pairs: [CookChannelPair; MAX_PAIRS],
533 codebooks: Codebooks,
541 info: NACodecInfo::new_dummy(),
542 chmap: NAChannelMap::new(),
547 pairs: [CookChannelPair::new(); MAX_PAIRS],
548 codebooks: Codebooks::new(),
550 dsp: CookDSP::new(1024),
555 impl NADecoder for CookDecoder {
556 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
557 if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
558 let edata = info.get_extradata().unwrap();
559 validate!(edata.len() >= 4);
561 let mut mr = MemoryReader::new_read(&edata);
562 let mut br = ByteReader::new(&mut mr);
563 let ver = br.peek_u32be()?;
565 let maj_ver = ver >> 24;
566 let mut chmap: u32 = 0;
570 self.pairs[0].read_hdr_v1(&mut br)?;
571 self.channels = self.pairs[0].mode.get_channels();
572 if ainfo.get_channels() == 1 { // forced mono
573 self.pairs[0].mode = Mode::Mono;
581 self.num_pairs = (edata.len() - (br.tell() as usize)) / 20;
582 validate!(self.num_pairs <= MAX_PAIRS);
583 let mut start_ch = 0;
584 for i in 0..self.num_pairs {
585 let pair_chmap = self.pairs[i].read_hdr_v2(&mut br)?;
586 self.pairs[i].start_ch = start_ch;
587 validate!((chmap & pair_chmap) == 0);
588 start_ch += self.pairs[i].mode.get_channels();
590 self.channels = start_ch;
592 _ => { return Err(DecoderError::InvalidData); }
595 self.samples = self.pairs[0].samples / self.pairs[0].mode.get_channels();
596 validate!((self.samples >= 16) && (self.samples <= 1024));
597 if self.samples != self.dsp.size {
598 self.dsp = CookDSP::new(self.samples);
600 self.chmap = NAChannelMap::from_ms_mapping(chmap);
602 for i in 1..self.num_pairs {
603 validate!((self.pairs[i].samples / self.pairs[i].mode.get_channels()) == self.samples);
606 let vector_bits = match self.samples {
607 16 | 32 | 64 | 128 | 256 => 5,
612 for pair in self.pairs.iter_mut() {
615 pair.vector_bits = 5;
618 pair.vector_bits = 5;
621 Mode::JointStereo => {
622 pair.vector_bits = vector_bits;
628 let ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), self.channels as u8,
629 SND_F32P_FORMAT, self.samples);
630 self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo));
634 Err(DecoderError::InvalidData)
637 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
638 let info = pkt.get_stream().get_info();
639 validate!(info.get_properties().is_audio());
640 let pktbuf = pkt.get_buffer();
641 validate!(pktbuf.len() > self.num_pairs * 2);
643 let mut seg_size: [usize; MAX_PAIRS] = [0; MAX_PAIRS];
644 let mut seg_start: [usize; MAX_PAIRS+1] = [0; MAX_PAIRS+1];
646 let ainfo = self.info.get_properties().get_audio_info().unwrap();
648 seg_size[0] = pktbuf.len() - (self.num_pairs - 1);
649 for i in 1..self.num_pairs {
650 seg_size[i] = (pktbuf[pktbuf.len() - self.num_pairs + i] as usize) * 2;
651 validate!(seg_size[i] != 0);
652 let ret = seg_size[0].checked_sub(seg_size[i]);
653 if let Some(val) = ret {
656 return Err(DecoderError::InvalidData);
659 validate!(seg_size[0] != 0);
661 for i in 0..self.num_pairs {
662 seg_start[i + 1] = seg_start[i] + seg_size[i];
665 let mut abuf = alloc_audio_buffer(ainfo, self.samples, self.chmap.clone())?;
667 for pair in 0..self.num_pairs {
668 self.pairs[pair].decode(&mut self.dsp, &mut self.rnd, &self.codebooks, &pktbuf[seg_start[pair]..seg_start[pair + 1]], &mut self.src, &mut abuf)?;
671 let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
672 frm.set_keyframe(true);
673 Ok(Rc::new(RefCell::new(frm)))
677 pub fn get_decoder() -> Box<NADecoder> {
678 Box::new(CookDecoder::new())
683 use crate::test::dec_video::*;
686 // let file = "assets/RV/rv30_weighted_mc.rm";
687 let file = "assets/RV/multichannel.rma";
688 test_decode_audio("realmedia", file, Some(2000), "cook");
692 const COOK_XOR_KEY: [u8; 4] = [ 0x37, 0xC5, 0x11, 0xF2 ];
694 const COOK_CPL_2BITS_BITS: &[u8; 3] = &[ 2, 1, 2 ];
695 const COOK_CPL_2BITS_CODES: &[u16; 3] = &[ 0x02, 0x00, 0x03 ];
696 const COOK_CPL_3BITS_BITS: &[u8; 7] = &[ 6, 5, 2, 1, 3, 4, 6 ];
697 const COOK_CPL_3BITS_CODES: &[u16; 7] = &[ 0x3e, 0x1e, 0x02, 0x00, 0x06, 0x0e, 0x3f ];
698 const COOK_CPL_4BITS_BITS: &[u8; 15] = &[ 8, 8, 7, 6, 5, 4, 3, 1, 3, 4, 5, 6, 7, 8, 8 ];
699 const COOK_CPL_4BITS_CODES: &[u16; 15] = &[
700 0xfc, 0xfd, 0x7c, 0x3c, 0x1c, 0x0c, 0x04, 0x00,
701 0x05, 0x0d, 0x1d, 0x3d, 0x7d, 0xfe, 0xff
703 const COOK_CPL_5BITS_BITS: &[u8; 31] = &[
704 10, 10, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 3, 1,
705 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 10
707 const COOK_CPL_5BITS_CODES: &[u16; 31] = &[
708 0x03F8, 0x03F9, 0x03FA, 0x03FB, 0x01F8, 0x01F9, 0x00F8, 0x00F9,
709 0x0078, 0x0079, 0x0038, 0x0039, 0x0018, 0x0019, 0x0004, 0x0000,
710 0x0005, 0x001A, 0x001B, 0x003A, 0x003B, 0x007A, 0x007B, 0x00FA,
711 0x00FB, 0x01FA, 0x01FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF
713 const COOK_CPL_6BITS_BITS: &[u8; 63] = &[
714 16, 15, 14, 13, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9,
715 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 5, 5, 3, 1,
716 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9,
717 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 14, 14, 16
719 const COOK_CPL_6BITS_CODES: &[u16; 63] = &[
720 0xFFFE, 0x7FFE, 0x3FFC, 0x1FFC, 0x0FFC, 0x07F6, 0x07F7, 0x07F8,
721 0x07F9, 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x01F0, 0x01F1, 0x01F2,
722 0x01F3, 0x01F4, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x0070, 0x0071,
723 0x0072, 0x0073, 0x0034, 0x0035, 0x0016, 0x0017, 0x0004, 0x0000,
724 0x000A, 0x0018, 0x0019, 0x0036, 0x0037, 0x0074, 0x0075, 0x0076,
725 0x0077, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x01F5, 0x01F6, 0x01F7,
726 0x01F8, 0x03F6, 0x03F7, 0x03F8, 0x03F9, 0x03FA, 0x07FA, 0x07FB,
727 0x07FC, 0x07FD, 0x0FFD, 0x1FFD, 0x3FFD, 0x3FFE, 0xFFFF
730 const COOK_QUANT_BITS: [&[u8; 24]; 13] = [
731 &[ 4, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 5, 7, 8, 9, 11, 11, 12, 12, 12, 12 ],
732 &[ 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 7, 9, 11, 12, 13, 15, 15, 15, 16, 16 ],
733 &[ 12, 10, 8, 6, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 5, 5, 7, 9, 11, 13, 14, 14 ],
734 &[ 13, 10, 9, 9, 7, 7, 5, 5, 4, 3, 3, 3, 3, 3, 4, 4, 4, 5, 7, 9, 11, 13, 13, 13 ],
735 &[ 12, 13, 10, 8, 6, 6, 5, 5, 4, 4, 3, 3, 3, 3, 3, 4, 5, 5, 6, 7, 9, 11, 14, 14 ],
736 &[ 12, 11, 9, 8, 8, 7, 5, 4, 4, 3, 3, 3, 3, 3, 4, 4, 5, 5, 7, 8, 10, 13, 14, 14 ],
737 &[ 15, 16, 15, 12, 10, 8, 6, 5, 4, 3, 3, 3, 2, 3, 4, 5, 5, 7, 9, 11, 13, 16, 16, 16 ],
738 &[ 14, 14, 11, 10, 9, 7, 7, 5, 5, 4, 3, 3, 2, 3, 3, 4, 5, 7, 9, 9, 12, 14, 15, 15 ],
739 &[ 9, 9, 9, 8, 7, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 13 ],
740 &[ 14, 12, 10, 8, 6, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 8, 8, 9, 11, 14, 14, 14 ],
741 &[ 13, 10, 9, 8, 6, 6, 5, 4, 4, 4, 3, 3, 2, 3, 4, 5, 6, 8, 9, 9, 11, 12, 14, 14 ],
742 &[ 16, 13, 12, 11, 9, 6, 5, 5, 4, 4, 4, 3, 2, 3, 3, 4, 5, 7, 8, 10, 14, 16, 16, 16 ],
743 &[ 13, 14, 14, 14, 10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9, 11, 14, 14, 14 ],
745 const COOK_QUANT_CODES: [&[u16; 24]; 13] = [
746 &[ 0x0006, 0x003e, 0x001c, 0x001d, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x0000, 0x0001,
747 0x0002, 0x000d, 0x001e, 0x007e, 0x00fe, 0x01fe, 0x07fc, 0x07fd, 0x0ffc, 0x0ffd, 0x0ffe, 0x0fff ],
748 &[ 0x03fe, 0x00fe, 0x003e, 0x001c, 0x001d, 0x000c, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005,
749 0x000d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x0ffe, 0x1ffe, 0x7ffc, 0x7ffd, 0x7ffe, 0xfffe, 0xffff ],
750 &[ 0x0ffe, 0x03fe, 0x00fe, 0x003e, 0x001c, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x0000,
751 0x0001, 0x0002, 0x000c, 0x000d, 0x001d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x1ffe, 0x3ffe, 0x3fff ],
752 &[ 0x1ffc, 0x03fe, 0x01fc, 0x01fd, 0x007c, 0x007d, 0x001c, 0x001d, 0x000a, 0x0000, 0x0001, 0x0002,
753 0x0003, 0x0004, 0x000b, 0x000c, 0x000d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x1ffd, 0x1ffe, 0x1fff ],
754 &[ 0x0ffe, 0x1ffe, 0x03fe, 0x00fe, 0x003c, 0x003d, 0x001a, 0x001b, 0x000a, 0x000b, 0x0000, 0x0001,
755 0x0002, 0x0003, 0x0004, 0x000c, 0x001c, 0x001d, 0x003e, 0x007e, 0x01fe, 0x07fe, 0x3ffe, 0x3fff ],
756 &[ 0x0ffe, 0x07fe, 0x01fe, 0x00fc, 0x00fd, 0x007c, 0x001c, 0x000a, 0x000b, 0x0000, 0x0001, 0x0002,
757 0x0003, 0x0004, 0x000c, 0x000d, 0x001d, 0x001e, 0x007d, 0x00fe, 0x03fe, 0x1ffe, 0x3ffe, 0x3fff ],
758 &[ 0x7ffc, 0xfffc, 0x7ffd, 0x0ffe, 0x03fe, 0x00fe, 0x003e, 0x001c, 0x000c, 0x0002, 0x0003, 0x0004,
759 0x0000, 0x0005, 0x000d, 0x001d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x1ffe, 0xfffd, 0xfffe, 0xffff ],
760 &[ 0x3ffc, 0x3ffd, 0x07fe, 0x03fe, 0x01fc, 0x007c, 0x007d, 0x001c, 0x001d, 0x000c, 0x0002, 0x0003,
761 0x0000, 0x0004, 0x0005, 0x000d, 0x001e, 0x007e, 0x01fd, 0x01fe, 0x0ffe, 0x3ffe, 0x7ffe, 0x7fff ],
762 &[ 0x01fc, 0x01fd, 0x01fe, 0x00fc, 0x007c, 0x003c, 0x001c, 0x000c, 0x0000, 0x0001, 0x0002, 0x0003,
763 0x0004, 0x0005, 0x000d, 0x001d, 0x003d, 0x007d, 0x00fd, 0x03fe, 0x07fe, 0x0ffe, 0x1ffe, 0x1fff ],
764 &[ 0x3ffc, 0x0ffe, 0x03fe, 0x00fc, 0x003c, 0x003d, 0x001c, 0x000c, 0x0000, 0x0001, 0x0002, 0x0003,
765 0x0004, 0x0005, 0x000d, 0x001d, 0x003e, 0x00fd, 0x00fe, 0x01fe, 0x07fe, 0x3ffd, 0x3ffe, 0x3fff ],
766 &[ 0x1ffe, 0x03fe, 0x01fc, 0x00fc, 0x003c, 0x003d, 0x001c, 0x000a, 0x000b, 0x000c, 0x0002, 0x0003,
767 0x0000, 0x0004, 0x000d, 0x001d, 0x003e, 0x00fd, 0x01fd, 0x01fe, 0x07fe, 0x0ffe, 0x3ffe, 0x3fff ],
768 &[ 0xfffc, 0x1ffe, 0x0ffe, 0x07fe, 0x01fe, 0x003e, 0x001c, 0x001d, 0x000a, 0x000b, 0x000c, 0x0002,
769 0x0000, 0x0003, 0x0004, 0x000d, 0x001e, 0x007e, 0x00fe, 0x03fe, 0x3ffe, 0xfffd, 0xfffe, 0xffff ],
770 &[ 0x1ffc, 0x3ffa, 0x3ffb, 0x3ffc, 0x03fe, 0x00fe, 0x007c, 0x007d, 0x001c, 0x000c, 0x0002, 0x0003,
771 0x0000, 0x0004, 0x0005, 0x000d, 0x001d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x3ffd, 0x3ffe, 0x3fff ],
774 const COOK_VQ0_BITS: &[u8; 191] = &[
775 1, 4, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10,
776 11, 11, 4, 5, 6, 7, 7, 8, 8, 9, 9, 9,
777 9, 10, 11, 11, 5, 6, 7, 8, 8, 9, 9, 9,
778 9, 10, 10, 10, 11, 12, 6, 7, 8, 9, 9, 9,
779 9, 10, 10, 10, 10, 11, 12, 13, 7, 7, 8, 9,
780 9, 9, 10, 10, 10, 10, 11, 11, 12, 13, 8, 8,
781 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 13, 14,
782 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13,
783 13, 15, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12,
784 12, 13, 14, 15, 9, 9, 9, 10, 10, 10, 11, 11,
785 12, 13, 12, 14, 15, 16, 9, 9, 10, 10, 10, 10,
786 11, 12, 12, 14, 14, 16, 16, 0, 9, 9, 10, 10,
787 11, 11, 12, 13, 13, 14, 14, 15, 0, 0, 10, 10,
788 10, 11, 11, 12, 12, 13, 15, 15, 16, 0, 0, 0,
789 11, 11, 11, 12, 13, 13, 13, 15, 16, 16, 0, 0,
790 0, 0, 11, 11, 12, 13, 13, 14, 15, 16, 16
792 const COOK_VQ0_CODES: &[u16; 191] = &[
793 0x0000, 0x0008, 0x002c, 0x002d, 0x0062, 0x0063, 0x00d4, 0x00d5,
794 0x00d6, 0x01c6, 0x01c7, 0x03ca, 0x07d6, 0x07d7, 0x0009, 0x0014,
795 0x002e, 0x0064, 0x0065, 0x00d7, 0x00d8, 0x01c8, 0x01c9, 0x01ca,
796 0x01cb, 0x03cb, 0x07d8, 0x07d9, 0x0015, 0x002f, 0x0066, 0x00d9,
797 0x00da, 0x01cc, 0x01cd, 0x01ce, 0x01cf, 0x03cc, 0x03cd, 0x03ce,
798 0x07da, 0x0fe4, 0x0030, 0x0067, 0x00db, 0x01d0, 0x01d1, 0x01d2,
799 0x01d3, 0x03cf, 0x03d0, 0x03d1, 0x03d2, 0x07db, 0x0fe5, 0x1fea,
800 0x0068, 0x0069, 0x00dc, 0x01d4, 0x01d5, 0x01d6, 0x03d3, 0x03d4,
801 0x03d5, 0x03d6, 0x07dc, 0x07dd, 0x0fe6, 0x1feb, 0x00dd, 0x00de,
802 0x01d7, 0x01d8, 0x01d9, 0x03d7, 0x03d8, 0x03d9, 0x03da, 0x07de,
803 0x07df, 0x0fe7, 0x1fec, 0x3ff2, 0x00df, 0x00e0, 0x01da, 0x01db,
804 0x03db, 0x03dc, 0x07e0, 0x07e1, 0x07e2, 0x0fe8, 0x0fe9, 0x1fed,
805 0x1fee, 0x7ff4, 0x00e1, 0x00e2, 0x01dc, 0x01dd, 0x03dd, 0x03de,
806 0x07e3, 0x07e4, 0x07e5, 0x0fea, 0x0feb, 0x1fef, 0x3ff3, 0x7ff5,
807 0x01de, 0x01df, 0x01e0, 0x03df, 0x03e0, 0x03e1, 0x07e6, 0x07e7,
808 0x0fec, 0x1ff0, 0x0fed, 0x3ff4, 0x7ff6, 0xfff8, 0x01e1, 0x01e2,
809 0x03e2, 0x03e3, 0x03e4, 0x03e5, 0x07e8, 0x0fee, 0x0fef, 0x3ff5,
810 0x3ff6, 0xfff9, 0xfffa, 0xfffa, 0x01e3, 0x01e4, 0x03e6, 0x03e7,
811 0x07e9, 0x07ea, 0x0ff0, 0x1ff1, 0x1ff2, 0x3ff7, 0x3ff8, 0x7ff7,
812 0x7ff7, 0xfffa, 0x03e8, 0x03e9, 0x03ea, 0x07eb, 0x07ec, 0x0ff1,
813 0x0ff2, 0x1ff3, 0x7ff8, 0x7ff9, 0xfffb, 0x3ff8, 0x7ff7, 0x7ff7,
814 0x07ed, 0x07ee, 0x07ef, 0x0ff3, 0x1ff4, 0x1ff5, 0x1ff6, 0x7ffa,
815 0xfffc, 0xfffd, 0xfffb, 0xfffb, 0x3ff8, 0x7ff7, 0x07f0, 0x07f1,
816 0x0ff4, 0x1ff7, 0x1ff8, 0x3ff9, 0x7ffb, 0xfffe, 0xffff
818 const COOK_VQ1_BITS: &[u8; 97] = &[
819 1, 4, 5, 6, 7, 8, 8, 9, 10, 10, 4, 5,
820 6, 7, 7, 8, 8, 9, 9, 11, 5, 5, 6, 7,
821 8, 8, 9, 9, 10, 11, 6, 6, 7, 8, 8, 9,
822 9, 10, 11, 12, 7, 7, 8, 8, 9, 9, 10, 11,
823 11, 13, 8, 8, 8, 9, 9, 10, 10, 11, 12, 14,
824 8, 8, 8, 9, 10, 11, 11, 12, 13, 15, 9, 9,
825 9, 10, 11, 12, 12, 14, 14, 0, 9, 9, 9, 10,
826 11, 12, 14, 16, 0, 0, 10, 10, 11, 12, 13, 14, 16
828 const COOK_VQ1_CODES: &[u16; 97] = &[
829 0x0000, 0x0008, 0x0014, 0x0030, 0x006a, 0x00e2, 0x00e3, 0x01e4,
830 0x03ec, 0x03ed, 0x0009, 0x0015, 0x0031, 0x006b, 0x006c, 0x00e4,
831 0x00e5, 0x01e5, 0x01e6, 0x07f0, 0x0016, 0x0017, 0x0032, 0x006d,
832 0x00e6, 0x00e7, 0x01e7, 0x01e8, 0x03ee, 0x07f1, 0x0033, 0x0034,
833 0x006e, 0x00e8, 0x00e9, 0x01e9, 0x01ea, 0x03ef, 0x07f2, 0x0ff6,
834 0x006f, 0x0070, 0x00ea, 0x00eb, 0x01eb, 0x01ec, 0x03f0, 0x07f3,
835 0x07f4, 0x1ffa, 0x00ec, 0x00ed, 0x00ee, 0x01ed, 0x01ee, 0x03f1,
836 0x03f2, 0x07f5, 0x0ff7, 0x3ffa, 0x00ef, 0x00f0, 0x00f1, 0x01ef,
837 0x03f3, 0x07f6, 0x07f7, 0x0ff8, 0x1ffb, 0x7ffe, 0x01f0, 0x01f1,
838 0x01f2, 0x03f4, 0x07f8, 0x0ff9, 0x0ffa, 0x3ffb, 0x3ffc, 0x0000,
839 0x01f3, 0x01f4, 0x01f5, 0x03f5, 0x07f9, 0x0ffb, 0x3ffd, 0xfffe,
840 0x0000, 0x0000, 0x03f6, 0x03f7, 0x07fa, 0x0ffc, 0x1ffc, 0x3ffe,
843 const COOK_VQ2_BITS: &[u8; 48] = &[
844 1, 4, 5, 7, 8, 9, 10, 3, 4, 5, 7, 8,
845 9, 10, 5, 5, 6, 7, 8, 10, 10, 7, 6, 7,
846 8, 9, 10, 12, 8, 8, 8, 9, 10, 12, 14, 8,
847 9, 9, 10, 11, 15, 16, 9, 10, 11, 12, 13, 16
849 const COOK_VQ2_CODES: &[u16; 48] = &[
850 0x0000, 0x000a, 0x0018, 0x0074, 0x00f2, 0x01f4, 0x03f6, 0x0004, 0x000b, 0x0019, 0x0075, 0x00f3,
851 0x01f5, 0x03f7, 0x001a, 0x001b, 0x0038, 0x0076, 0x00f4, 0x03f8, 0x03f9, 0x0077, 0x0039, 0x0078,
852 0x00f5, 0x01f6, 0x03fa, 0x0ffc, 0x00f6, 0x00f7, 0x00f8, 0x01f7, 0x03fb, 0x0ffd, 0x3ffe, 0x00f9,
853 0x01f8, 0x01f9, 0x03fc, 0x07fc, 0x7ffe, 0xfffe, 0x01fa, 0x03fd, 0x07fd, 0x0ffe, 0x1ffe, 0xffff
855 const COOK_VQ3_BITS: &[u8; 607] = &[
856 2, 4, 6, 8, 10, 5, 5, 6, 8, 10, 7, 8,
857 8, 10, 12, 9, 9, 10, 12, 15, 10, 11, 13, 16,
858 16, 5, 6, 8, 10, 11, 5, 6, 8, 10, 12, 7,
859 7, 8, 10, 13, 9, 9, 10, 12, 15, 12, 11, 13,
860 16, 16, 7, 9, 10, 12, 15, 7, 8, 10, 12, 13,
861 9, 9, 11, 13, 16, 11, 11, 12, 14, 16, 12, 12,
862 14, 16, 0, 9, 11, 12, 16, 16, 9, 10, 13, 15,
863 16, 10, 11, 12, 16, 16, 13, 13, 16, 16, 16, 16,
864 16, 15, 16, 0, 11, 13, 16, 16, 15, 11, 13, 15,
865 16, 16, 13, 13, 16, 16, 0, 14, 16, 16, 16, 0,
866 16, 16, 0, 0, 0, 4, 6, 8, 10, 13, 6, 6,
867 8, 10, 13, 9, 8, 10, 12, 16, 10, 10, 11, 15,
868 16, 13, 12, 14, 16, 16, 5, 6, 8, 11, 13, 6,
869 6, 8, 10, 13, 8, 8, 9, 11, 14, 10, 10, 12,
870 12, 16, 13, 12, 13, 15, 16, 7, 8, 9, 12, 16,
871 7, 8, 10, 12, 14, 9, 9, 10, 13, 16, 11, 10,
872 12, 15, 16, 13, 13, 16, 16, 0, 9, 11, 13, 16,
873 16, 9, 10, 12, 15, 16, 10, 11, 13, 16, 16, 13,
874 12, 16, 16, 16, 16, 16, 16, 16, 0, 11, 13, 16,
875 16, 16, 11, 13, 16, 16, 16, 12, 13, 15, 16, 0,
876 16, 16, 16, 16, 0, 16, 16, 0, 0, 0, 6, 8,
877 11, 13, 16, 8, 8, 10, 12, 16, 11, 10, 11, 13,
878 16, 12, 13, 13, 15, 16, 16, 16, 14, 16, 0, 6,
879 8, 10, 13, 16, 8, 8, 10, 12, 16, 10, 10, 11,
880 13, 16, 13, 12, 13, 16, 16, 14, 14, 14, 16, 0,
881 8, 9, 11, 13, 16, 8, 9, 11, 16, 14, 10, 10,
882 12, 15, 16, 12, 12, 13, 16, 16, 15, 16, 16, 16,
883 0, 10, 12, 15, 16, 16, 10, 12, 12, 14, 16, 12,
884 12, 13, 16, 16, 14, 15, 16, 16, 0, 16, 16, 16,
885 0, 0, 12, 15, 15, 16, 0, 13, 13, 16, 16, 0,
886 14, 16, 16, 16, 0, 16, 16, 16, 0, 0, 0, 0,
887 0, 0, 0, 8, 10, 13, 15, 16, 10, 11, 13, 16,
888 16, 13, 13, 14, 16, 16, 16, 16, 16, 16, 16, 16,
889 16, 16, 16, 0, 8, 10, 11, 15, 16, 9, 10, 12,
890 16, 16, 12, 12, 15, 16, 16, 16, 14, 16, 16, 16,
891 16, 16, 16, 16, 0, 9, 11, 14, 16, 16, 10, 11,
892 13, 16, 16, 14, 13, 14, 16, 16, 16, 15, 15, 16,
893 0, 16, 16, 16, 0, 0, 11, 13, 16, 16, 16, 11,
894 13, 15, 16, 16, 13, 16, 16, 16, 0, 16, 16, 16,
895 16, 0, 16, 16, 0, 0, 0, 15, 16, 16, 16, 0,
896 14, 16, 16, 16, 0, 16, 16, 16, 0, 0, 16, 16,
897 0, 0, 0, 0, 0, 0, 0, 0, 9, 13, 16, 16,
898 16, 11, 13, 16, 16, 16, 14, 15, 16, 16, 0, 15,
899 16, 16, 16, 0, 16, 16, 0, 0, 0, 9, 13, 15,
900 15, 16, 12, 13, 14, 16, 16, 16, 15, 16, 16, 0,
901 16, 16, 16, 16, 0, 16, 16, 0, 0, 0, 11, 13,
902 15, 16, 0, 12, 14, 16, 16, 0, 16, 16, 16, 16,
903 0, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 16,
904 16, 16, 16, 0, 16, 16, 16, 16, 0, 16, 16, 16,
905 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0,
906 16, 16, 0, 0, 0, 16, 16
908 const COOK_VQ3_CODES: &[u16; 607] = &[
909 0x0000, 0x0004, 0x0022, 0x00c6, 0x03b0, 0x000c, 0x000d, 0x0023, 0x00c7, 0x03b1, 0x005c, 0x00c8,
910 0x00c9, 0x03b2, 0x0fa4, 0x01c2, 0x01c3, 0x03b3, 0x0fa5, 0x7f72, 0x03b4, 0x07b2, 0x1f9a, 0xff24,
911 0xff25, 0x000e, 0x0024, 0x00ca, 0x03b5, 0x07b3, 0x000f, 0x0025, 0x00cb, 0x03b6, 0x0fa6, 0x005d,
912 0x005e, 0x00cc, 0x03b7, 0x1f9b, 0x01c4, 0x01c5, 0x03b8, 0x0fa7, 0x7f73, 0x0fa8, 0x07b4, 0x1f9c,
913 0xff26, 0xff27, 0x005f, 0x01c6, 0x03b9, 0x0fa9, 0x7f74, 0x0060, 0x00cd, 0x03ba, 0x0faa, 0x1f9d,
914 0x01c7, 0x01c8, 0x07b5, 0x1f9e, 0xff28, 0x07b6, 0x07b7, 0x0fab, 0x3fa2, 0xff29, 0x0fac, 0x0fad,
915 0x3fa3, 0xff2a, 0x3fa2, 0x01c9, 0x07b8, 0x0fae, 0xff2b, 0xff2c, 0x01ca, 0x03bb, 0x1f9f, 0x7f75,
916 0xff2d, 0x03bc, 0x07b9, 0x0faf, 0xff2e, 0xff2f, 0x1fa0, 0x1fa1, 0xff30, 0xff31, 0xff32, 0xff33,
917 0xff34, 0x7f76, 0xff35, 0xff31, 0x07ba, 0x1fa2, 0xff36, 0xff37, 0x7f77, 0x07bb, 0x1fa3, 0x7f78,
918 0xff38, 0xff39, 0x1fa4, 0x1fa5, 0xff3a, 0xff3b, 0xff2e, 0x3fa4, 0xff3c, 0xff3d, 0xff3e, 0xff31,
919 0xff3f, 0xff40, 0xff30, 0xff31, 0xff31, 0x0005, 0x0026, 0x00ce, 0x03bd, 0x1fa6, 0x0027, 0x0028,
920 0x00cf, 0x03be, 0x1fa7, 0x01cb, 0x00d0, 0x03bf, 0x0fb0, 0xff41, 0x03c0, 0x03c1, 0x07bc, 0x7f79,
921 0xff42, 0x1fa8, 0x0fb1, 0x3fa5, 0xff43, 0xff44, 0x0010, 0x0029, 0x00d1, 0x07bd, 0x1fa9, 0x002a,
922 0x002b, 0x00d2, 0x03c2, 0x1faa, 0x00d3, 0x00d4, 0x01cc, 0x07be, 0x3fa6, 0x03c3, 0x03c4, 0x0fb2,
923 0x0fb3, 0xff45, 0x1fab, 0x0fb4, 0x1fac, 0x7f7a, 0xff46, 0x0061, 0x00d5, 0x01cd, 0x0fb5, 0xff47,
924 0x0062, 0x00d6, 0x03c5, 0x0fb6, 0x3fa7, 0x01ce, 0x01cf, 0x03c6, 0x1fad, 0xff48, 0x07bf, 0x03c7,
925 0x0fb7, 0x7f7b, 0xff49, 0x1fae, 0x1faf, 0xff4a, 0xff4b, 0x7f7b, 0x01d0, 0x07c0, 0x1fb0, 0xff4c,
926 0xff4d, 0x01d1, 0x03c8, 0x0fb8, 0x7f7c, 0xff4e, 0x03c9, 0x07c1, 0x1fb1, 0xff4f, 0xff50, 0x1fb2,
927 0x0fb9, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff52, 0x07c2, 0x1fb3, 0xff58,
928 0xff59, 0xff5a, 0x07c3, 0x1fb4, 0xff5b, 0xff5c, 0xff5d, 0x0fba, 0x1fb5, 0x7f7d, 0xff5e, 0xff4f,
929 0xff5f, 0xff60, 0xff61, 0xff62, 0xff52, 0xff63, 0xff64, 0xff51, 0xff52, 0xff52, 0x002c, 0x00d7,
930 0x07c4, 0x1fb6, 0xff65, 0x00d8, 0x00d9, 0x03ca, 0x0fbb, 0xff66, 0x07c5, 0x03cb, 0x07c6, 0x1fb7,
931 0xff67, 0x0fbc, 0x1fb8, 0x1fb9, 0x7f7e, 0xff68, 0xff69, 0xff6a, 0x3fa8, 0xff6b, 0x7f7e, 0x002d,
932 0x00da, 0x03cc, 0x1fba, 0xff6c, 0x00db, 0x00dc, 0x03cd, 0x0fbd, 0xff6d, 0x03ce, 0x03cf, 0x07c7,
933 0x1fbb, 0xff6e, 0x1fbc, 0x0fbe, 0x1fbd, 0xff6f, 0xff70, 0x3fa9, 0x3faa, 0x3fab, 0xff71, 0xff6f,
934 0x00dd, 0x01d2, 0x07c8, 0x1fbe, 0xff72, 0x00de, 0x01d3, 0x07c9, 0xff73, 0x3fac, 0x03d0, 0x03d1,
935 0x0fbf, 0x7f7f, 0xff74, 0x0fc0, 0x0fc1, 0x1fbf, 0xff75, 0xff76, 0x7f80, 0xff77, 0xff78, 0xff79,
936 0xff75, 0x03d2, 0x0fc2, 0x7f81, 0xff7a, 0xff7b, 0x03d3, 0x0fc3, 0x0fc4, 0x3fad, 0xff7c, 0x0fc5,
937 0x0fc6, 0x1fc0, 0xff7d, 0xff7e, 0x3fae, 0x7f82, 0xff7f, 0xff80, 0xff80, 0xff81, 0xff82, 0xff83,
938 0xff80, 0xff80, 0x0fc7, 0x7f83, 0x7f84, 0xff84, 0xff7a, 0x1fc1, 0x1fc2, 0xff85, 0xff86, 0x3fad,
939 0x3faf, 0xff87, 0xff88, 0xff89, 0xff7d, 0xff8a, 0xff8b, 0xff8c, 0xff80, 0xff80, 0x3fae, 0x7f82,
940 0xff7f, 0xff80, 0xff80, 0x00df, 0x03d4, 0x1fc3, 0x7f85, 0xff8d, 0x03d5, 0x07ca, 0x1fc4, 0xff8e,
941 0xff8f, 0x1fc5, 0x1fc6, 0x3fb0, 0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97,
942 0xff98, 0xff99, 0xff9a, 0xff95, 0x00e0, 0x03d6, 0x07cb, 0x7f86, 0xff9b, 0x01d4, 0x03d7, 0x0fc8,
943 0xff9c, 0xff9d, 0x0fc9, 0x0fca, 0x7f87, 0xff9e, 0xff9f, 0xffa0, 0x3fb1, 0xffa1, 0xffa2, 0xffa3,
944 0xffa4, 0xffa5, 0xffa6, 0xffa7, 0xffa2, 0x01d5, 0x07cc, 0x3fb2, 0xffa8, 0xffa9, 0x03d8, 0x07cd,
945 0x1fc7, 0xffaa, 0xffab, 0x3fb3, 0x1fc8, 0x3fb4, 0xffac, 0xffad, 0xffae, 0x7f88, 0x7f89, 0xffaf,
946 0xffaf, 0xffb0, 0xffb1, 0xffb2, 0xffaf, 0xffaf, 0x07ce, 0x1fc9, 0xffb3, 0xffb4, 0xffb5, 0x07cf,
947 0x1fca, 0x7f8a, 0xffb6, 0xffb7, 0x1fcb, 0xffb8, 0xffb9, 0xffba, 0xffba, 0xffbb, 0xffbc, 0xffbd,
948 0xffbe, 0xffbe, 0xffbf, 0xffc0, 0xffbd, 0xffbe, 0xffbe, 0x7f8b, 0xffc1, 0xffc2, 0xffc3, 0xffb4,
949 0x3fb5, 0xffc4, 0xffc5, 0xffc6, 0xffb6, 0xffc7, 0xffc8, 0xffc9, 0xffba, 0xffba, 0xffca, 0xffcb,
950 0xffbd, 0xffbe, 0xffbe, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbe, 0x01d6, 0x1fcc, 0xffcc, 0xffcd,
951 0xffce, 0x07d0, 0x1fcd, 0xffcf, 0xffd0, 0xffd1, 0x3fb6, 0x7f8c, 0xffd2, 0xffd3, 0xff90, 0x7f8d,
952 0xffd4, 0xffd5, 0xffd6, 0xff95, 0xffd7, 0xffd8, 0xff94, 0xff95, 0xff95, 0x01d7, 0x1fce, 0x7f8e,
953 0x7f8f, 0xffd9, 0x0fcb, 0x1fcf, 0x3fb7, 0xffda, 0xffdb, 0xffdc, 0x7f90, 0xffdd, 0xffde, 0xff9e,
954 0xffdf, 0xffe0, 0xffe1, 0xffe2, 0xffa2, 0xffe3, 0xffe4, 0xffa1, 0xffa2, 0xffa2, 0x07d1, 0x1fd0,
955 0x7f91, 0xffe5, 0xffa8, 0x0fcc, 0x3fb8, 0xffe6, 0xffe7, 0xffaa, 0xffe8, 0xffe9, 0xffea, 0xffeb,
956 0xffac, 0xffec, 0xffed, 0xffee, 0xffaf, 0xffaf, 0xffae, 0x7f88, 0x7f89, 0xffaf, 0xffaf, 0xffef,
957 0xfff0, 0xfff1, 0xfff2, 0xffb4, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xffb6, 0xfff7, 0xfff8, 0xfff9,
958 0xffba, 0xffba, 0xfffa, 0xfffb, 0xffbd, 0xffbe, 0xffbe, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbe,
959 0xfffc, 0xfffd, 0xffb3, 0xffb4, 0xffb4, 0xfffe, 0xffff
961 const COOK_VQ4_BITS: &[u8; 246] = &[
962 2, 4, 7, 10, 4, 5, 7, 10, 7, 8, 10, 14,
963 11, 11, 15, 15, 4, 5, 9, 12, 5, 5, 8, 12,
964 8, 7, 10, 15, 11, 11, 15, 15, 7, 9, 12, 15,
965 8, 8, 12, 15, 10, 10, 13, 15, 14, 14, 15, 0,
966 11, 13, 15, 15, 11, 13, 15, 15, 14, 15, 15, 0,
967 15, 15, 0, 0, 4, 5, 9, 13, 5, 6, 9, 13,
968 9, 9, 11, 15, 14, 13, 15, 15, 4, 6, 9, 12,
969 5, 6, 9, 13, 9, 8, 11, 15, 13, 12, 15, 15,
970 7, 9, 12, 15, 7, 8, 11, 15, 10, 10, 14, 15,
971 14, 15, 15, 0, 10, 12, 15, 15, 11, 13, 15, 15,
972 15, 15, 15, 0, 15, 15, 0, 0, 6, 9, 13, 14,
973 8, 9, 12, 15, 12, 12, 15, 15, 15, 15, 15, 0,
974 7, 9, 13, 15, 8, 9, 12, 15, 11, 12, 15, 15,
975 15, 15, 15, 0, 9, 11, 15, 15, 9, 11, 15, 15,
976 14, 14, 15, 0, 15, 15, 0, 0, 14, 15, 15, 0,
977 14, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 0,
978 9, 12, 15, 15, 12, 13, 15, 15, 15, 15, 15, 0,
979 15, 15, 0, 0, 10, 12, 15, 15, 12, 14, 15, 15,
980 15, 15, 15, 0, 15, 15, 0, 0, 14, 15, 15, 0,
981 15, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 0,
984 const COOK_VQ4_CODES: &[u16; 246] = &[
985 0x0000, 0x0004, 0x006c, 0x03e6, 0x0005, 0x0012, 0x006d, 0x03e7, 0x006e, 0x00e8, 0x03e8, 0x3fc4,
986 0x07e0, 0x07e1, 0x7fa4, 0x7fa5, 0x0006, 0x0013, 0x01e2, 0x0fda, 0x0014, 0x0015, 0x00e9, 0x0fdb,
987 0x00ea, 0x006f, 0x03e9, 0x7fa6, 0x07e2, 0x07e3, 0x7fa7, 0x7fa8, 0x0070, 0x01e3, 0x0fdc, 0x7fa9,
988 0x00eb, 0x00ec, 0x0fdd, 0x7faa, 0x03ea, 0x03eb, 0x1fd6, 0x7fab, 0x3fc5, 0x3fc6, 0x7fac, 0x1fd6,
989 0x07e4, 0x1fd7, 0x7fad, 0x7fae, 0x07e5, 0x1fd8, 0x7faf, 0x7fb0, 0x3fc7, 0x7fb1, 0x7fb2, 0x1fd6,
990 0x7fb3, 0x7fb4, 0x1fd6, 0x1fd6, 0x0007, 0x0016, 0x01e4, 0x1fd9, 0x0017, 0x0032, 0x01e5, 0x1fda,
991 0x01e6, 0x01e7, 0x07e6, 0x7fb5, 0x3fc8, 0x1fdb, 0x7fb6, 0x7fb7, 0x0008, 0x0033, 0x01e8, 0x0fde,
992 0x0018, 0x0034, 0x01e9, 0x1fdc, 0x01ea, 0x00ed, 0x07e7, 0x7fb8, 0x1fdd, 0x0fdf, 0x7fb9, 0x7fba,
993 0x0071, 0x01eb, 0x0fe0, 0x7fbb, 0x0072, 0x00ee, 0x07e8, 0x7fbc, 0x03ec, 0x03ed, 0x3fc9, 0x7fbd,
994 0x3fca, 0x7fbe, 0x7fbf, 0x3fc9, 0x03ee, 0x0fe1, 0x7fc0, 0x7fc1, 0x07e9, 0x1fde, 0x7fc2, 0x7fc3,
995 0x7fc4, 0x7fc5, 0x7fc6, 0x3fc9, 0x7fc7, 0x7fc8, 0x3fc9, 0x3fc9, 0x0035, 0x01ec, 0x1fdf, 0x3fcb,
996 0x00ef, 0x01ed, 0x0fe2, 0x7fc9, 0x0fe3, 0x0fe4, 0x7fca, 0x7fcb, 0x7fcc, 0x7fcd, 0x7fce, 0x7fca,
997 0x0073, 0x01ee, 0x1fe0, 0x7fcf, 0x00f0, 0x01ef, 0x0fe5, 0x7fd0, 0x07ea, 0x0fe6, 0x7fd1, 0x7fd2,
998 0x7fd3, 0x7fd4, 0x7fd5, 0x7fd1, 0x01f0, 0x07eb, 0x7fd6, 0x7fd7, 0x01f1, 0x07ec, 0x7fd8, 0x7fd9,
999 0x3fcc, 0x3fcd, 0x7fda, 0x7fda, 0x7fdb, 0x7fdc, 0x7fda, 0x7fda, 0x3fce, 0x7fdd, 0x7fde, 0x7fd6,
1000 0x3fcf, 0x7fdf, 0x7fe0, 0x7fd8, 0x7fe1, 0x7fe2, 0x7fda, 0x7fda, 0x3fcc, 0x3fcd, 0x7fda, 0x7fda,
1001 0x01f2, 0x0fe7, 0x7fe3, 0x7fe4, 0x0fe8, 0x1fe1, 0x7fe5, 0x7fe6, 0x7fe7, 0x7fe8, 0x7fe9, 0x7fca,
1002 0x7fea, 0x7feb, 0x7fca, 0x7fca, 0x03ef, 0x0fe9, 0x7fec, 0x7fed, 0x0fea, 0x3fd0, 0x7fee, 0x7fef,
1003 0x7ff0, 0x7ff1, 0x7ff2, 0x7fd1, 0x7ff3, 0x7ff4, 0x7fd1, 0x7fd1, 0x3fd1, 0x7ff5, 0x7ff6, 0x7fd6,
1004 0x7ff7, 0x7ff8, 0x7ff9, 0x7fd8, 0x7ffa, 0x7ffb, 0x7fda, 0x7fda, 0x3fcc, 0x3fcd, 0x7fda, 0x7fda,
1005 0x7ffc, 0x7ffd, 0x7fd6, 0x7fd6, 0x7ffe, 0x7fff
1007 const COOK_VQ5_BITS: &[u8; 230] = &[
1008 2, 4, 8, 4, 5, 9, 9, 10, 14, 4, 6, 11,
1009 5, 6, 12, 10, 11, 15, 9, 11, 15, 10, 13, 15,
1010 14, 15, 0, 4, 6, 12, 6, 7, 12, 12, 12, 15,
1011 5, 7, 13, 6, 7, 13, 12, 13, 15, 10, 12, 15,
1012 11, 13, 15, 15, 15, 0, 8, 13, 15, 11, 12, 15,
1013 15, 15, 0, 10, 13, 15, 12, 15, 15, 15, 15, 0,
1014 15, 15, 0, 15, 15, 0, 0, 0, 0, 4, 5, 11,
1015 5, 7, 12, 11, 12, 15, 6, 7, 13, 7, 8, 14,
1016 12, 14, 15, 11, 13, 15, 12, 13, 15, 15, 15, 0,
1017 5, 6, 13, 7, 8, 15, 12, 14, 15, 6, 8, 14,
1018 7, 8, 15, 14, 15, 15, 12, 12, 15, 12, 13, 15,
1019 15, 15, 0, 9, 13, 15, 12, 13, 15, 15, 15, 0,
1020 11, 13, 15, 13, 13, 15, 15, 15, 0, 14, 15, 0,
1021 15, 15, 0, 0, 0, 0, 8, 10, 15, 11, 12, 15,
1022 15, 15, 0, 10, 12, 15, 12, 13, 15, 15, 15, 0,
1023 14, 15, 0, 15, 15, 0, 0, 0, 0, 8, 12, 15,
1024 12, 13, 15, 15, 15, 0, 11, 13, 15, 13, 15, 15,
1025 15, 15, 0, 15, 15, 0, 15, 15, 0, 0, 0, 0,
1026 14, 15, 0, 15, 15, 0, 0, 0, 0, 15, 15, 0,
1029 const COOK_VQ5_CODES: &[u16; 230] = &[
1030 0x0000, 0x0004, 0x00f0, 0x0005, 0x0012, 0x01f0, 0x01f1, 0x03e8, 0x3fce, 0x0006, 0x0030, 0x07de,
1031 0x0013, 0x0031, 0x0fd2, 0x03e9, 0x07df, 0x7fb0, 0x01f2, 0x07e0, 0x7fb1, 0x03ea, 0x1fd2, 0x7fb2,
1032 0x3fcf, 0x7fb3, 0x0031, 0x0007, 0x0032, 0x0fd3, 0x0033, 0x0070, 0x0fd4, 0x0fd5, 0x0fd6, 0x7fb4,
1033 0x0014, 0x0071, 0x1fd3, 0x0034, 0x0072, 0x1fd4, 0x0fd7, 0x1fd5, 0x7fb5, 0x03eb, 0x0fd8, 0x7fb6,
1034 0x07e1, 0x1fd6, 0x7fb7, 0x7fb8, 0x7fb9, 0x0072, 0x00f1, 0x1fd7, 0x7fba, 0x07e2, 0x0fd9, 0x7fbb,
1035 0x7fbc, 0x7fbd, 0x0070, 0x03ec, 0x1fd8, 0x7fbe, 0x0fda, 0x7fbf, 0x7fc0, 0x7fc1, 0x7fc2, 0x0072,
1036 0x7fc3, 0x7fc4, 0x0071, 0x7fc5, 0x7fc6, 0x0072, 0x0034, 0x0072, 0x0072, 0x0008, 0x0015, 0x07e3,
1037 0x0016, 0x0073, 0x0fdb, 0x07e4, 0x0fdc, 0x7fc7, 0x0035, 0x0074, 0x1fd9, 0x0075, 0x00f2, 0x3fd0,
1038 0x0fdd, 0x3fd1, 0x7fc8, 0x07e5, 0x1fda, 0x7fc9, 0x0fde, 0x1fdb, 0x7fca, 0x7fcb, 0x7fcc, 0x00f2,
1039 0x0017, 0x0036, 0x1fdc, 0x0076, 0x00f3, 0x7fcd, 0x0fdf, 0x3fd2, 0x7fce, 0x0037, 0x00f4, 0x3fd3,
1040 0x0077, 0x00f5, 0x7fcf, 0x3fd4, 0x7fd0, 0x7fd1, 0x0fe0, 0x0fe1, 0x7fd2, 0x0fe2, 0x1fdd, 0x7fd3,
1041 0x7fd4, 0x7fd5, 0x00f5, 0x01f3, 0x1fde, 0x7fd6, 0x0fe3, 0x1fdf, 0x7fd7, 0x7fd8, 0x7fd9, 0x00f3,
1042 0x07e6, 0x1fe0, 0x7fda, 0x1fe1, 0x1fe2, 0x7fdb, 0x7fdc, 0x7fdd, 0x00f5, 0x3fd5, 0x7fde, 0x00f4,
1043 0x7fdf, 0x7fe0, 0x00f5, 0x0077, 0x00f5, 0x00f5, 0x00f6, 0x03ed, 0x7fe1, 0x07e7, 0x0fe4, 0x7fe2,
1044 0x7fe3, 0x7fe4, 0x0073, 0x03ee, 0x0fe5, 0x7fe5, 0x0fe6, 0x1fe3, 0x7fe6, 0x7fe7, 0x7fe8, 0x00f2,
1045 0x3fd6, 0x7fe9, 0x0074, 0x7fea, 0x7feb, 0x00f2, 0x0075, 0x00f2, 0x00f2, 0x00f7, 0x0fe7, 0x7fec,
1046 0x0fe8, 0x1fe4, 0x7fed, 0x7fee, 0x7fef, 0x00f3, 0x07e8, 0x1fe5, 0x7ff0, 0x1fe6, 0x7ff1, 0x7ff2,
1047 0x7ff3, 0x7ff4, 0x00f5, 0x7ff5, 0x7ff6, 0x00f4, 0x7ff7, 0x7ff8, 0x00f5, 0x0077, 0x00f5, 0x00f5,
1048 0x3fd7, 0x7ff9, 0x0036, 0x7ffa, 0x7ffb, 0x00f3, 0x0076, 0x00f3, 0x00f3, 0x7ffc, 0x7ffd, 0x0000,
1051 const COOK_VQ6_BITS: &[u8; 32] = &[
1052 1, 4, 4, 6, 4, 6, 6, 8, 4, 6, 6, 8,
1053 6, 9, 8, 10, 4, 6, 7, 8, 6, 9, 8, 11,
1054 6, 9, 8, 10, 8, 10, 9, 11
1056 const COOK_VQ6_CODES: &[u16; 32] = &[
1057 0x0000, 0x0008, 0x0009, 0x0034, 0x000a, 0x0035, 0x0036, 0x00f6,
1058 0x000b, 0x0037, 0x0038, 0x00f7, 0x0039, 0x01fa, 0x00f8, 0x03fc,
1059 0x000c, 0x003a, 0x007a, 0x00f9, 0x003b, 0x01fb, 0x00fa, 0x07fe,
1060 0x003c, 0x01fc, 0x00fb, 0x03fd, 0x00fc, 0x03fe, 0x01fd, 0x07ff
1063 const COOK_CPL_SCALE2: &[f32; 5] = &[
1064 1.0, 0.953020632266998, 0.70710676908493, 0.302905440330505, 0.0
1066 const COOK_CPL_SCALE3: &[f32; 9] = &[
1067 1.0, 0.981279790401459, 0.936997592449188, 0.875934481620789, 0.70710676908493,
1068 0.482430040836334, 0.349335819482803, 0.192587479948997, 0.0
1070 const COOK_CPL_SCALE4: &[f32; 17] = &[
1071 1.0, 0.991486728191376, 0.973249018192291, 0.953020632266998, 0.930133521556854,
1072 0.903453230857849, 0.870746195316315, 0.826180458068848, 0.70710676908493,
1073 0.563405573368073, 0.491732746362686, 0.428686618804932, 0.367221474647522,
1074 0.302905440330505, 0.229752898216248, 0.130207896232605, 0.0
1076 const COOK_CPL_SCALE5: &[f32; 33] = &[
1077 1.0, 0.995926380157471, 0.987517595291138, 0.978726446628571, 0.969505727291107,
1078 0.95979779958725, 0.949531257152557, 0.938616216182709, 0.926936149597168,
1079 0.914336204528809, 0.900602877140045, 0.885426938533783, 0.868331849575043,
1080 0.84851086139679, 0.824381768703461, 0.791833400726318, 0.70710676908493,
1081 0.610737144947052, 0.566034197807312, 0.529177963733673, 0.495983630418777,
1082 0.464778542518616, 0.434642940759659, 0.404955863952637, 0.375219136476517,
1083 0.344963222742081, 0.313672333955765, 0.280692428350449, 0.245068684220314,
1084 0.205169528722763, 0.157508864998817, 0.0901700109243393, 0.0
1086 const COOK_CPL_SCALE6: &[f32; 65] = &[
1087 1.0, 0.998005926609039, 0.993956744670868, 0.989822506904602, 0.985598564147949,
1088 0.981279790401459, 0.976860702037811, 0.972335040569305, 0.967696130275726,
1089 0.962936460971832, 0.958047747612000, 0.953020632266998, 0.947844684123993,
1090 0.942508161067963, 0.936997592449188, 0.931297719478607, 0.925390899181366,
1091 0.919256627559662, 0.912870943546295, 0.906205296516418, 0.899225592613220,
1092 0.891890347003937, 0.884148240089417, 0.875934481620789, 0.867165684700012,
1093 0.857730865478516, 0.847477376461029, 0.836184680461884, 0.823513329029083,
1094 0.808890223503113, 0.791194140911102, 0.767520070075989, 0.707106769084930,
1095 0.641024887561798, 0.611565053462982, 0.587959706783295, 0.567296981811523,
1096 0.548448026180267, 0.530831515789032, 0.514098942279816, 0.498019754886627,
1097 0.482430040836334, 0.467206478118896, 0.452251672744751, 0.437485188245773,
1098 0.422837972640991, 0.408248275518417, 0.393658757209778, 0.379014074802399,
1099 0.364258885383606, 0.349335819482803, 0.334183186292648, 0.318732559680939,
1100 0.302905440330505, 0.286608695983887, 0.269728302955627, 0.252119421958923,
1101 0.233590632677078, 0.213876649737358, 0.192587479948997, 0.169101938605309,
1102 0.142307326197624, 0.109772264957428, 0.0631198287010193, 0.0
1104 const COOK_CPL_SCALES: [&[f32]; 5] = [
1105 COOK_CPL_SCALE2, COOK_CPL_SCALE3, COOK_CPL_SCALE4, COOK_CPL_SCALE5, COOK_CPL_SCALE6
1108 const COOK_CPL_BAND: [u8; MAX_SUBBANDS - 1] = [
1109 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 12, 13,
1110 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17,
1111 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19,
1115 const COOK_DITHER_TAB: [f32; 9] = [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.176777, 0.25, 0.707107, 1.0 ];
1117 const COOK_QUANT_CENTROID: [[f32; 14]; 7] = [
1118 [ 0.000, 0.392, 0.761, 1.120, 1.477, 1.832, 2.183, 2.541, 2.893, 3.245, 3.598, 3.942, 4.288, 4.724 ],
1119 [ 0.000, 0.544, 1.060, 1.563, 2.068, 2.571, 3.072, 3.562, 4.070, 4.620, 0.000, 0.000, 0.000, 0.000 ],
1120 [ 0.000, 0.746, 1.464, 2.180, 2.882, 3.584, 4.316, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ],
1121 [ 0.000, 1.006, 2.000, 2.993, 3.985, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ],
1122 [ 0.000, 1.321, 2.703, 3.983, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ],
1123 [ 0.000, 1.657, 3.491, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ],
1124 [ 0.000, 1.964, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ]
1127 const COOK_EXP_BITS: [i32; NUM_CATEGORIES] = [ 52, 47, 43, 37, 29, 22, 16, 0 ];