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