atrac3p_decoder/
lib.rs

1// Atrac3+ Decoder
2//
3// Copyright (c) 2020 Cory Forsstrom <cforsstrom18@gmail.com>
4// Copyright (c) 2010-2013 Maxim Poliakovski
5//
6// The following code is a derivative work of the code from the FFmpeg project,
7// which is licensed LGPL v2.1. This code therefore is also licensed under the terms
8// of the GNU Lesser General Public License, verison 2.1.
9
10use bitstream_io::{huffman::ReadHuffmanTree, BigEndian, BitReader};
11use riff_wave_reader::RiffWaveReader;
12
13use std::io::{Read, Seek, SeekFrom};
14
15mod error;
16pub use error::Error;
17
18mod data;
19use data::*;
20
21mod decoder;
22use decoder::*;
23
24#[allow(clippy::unreadable_literal)]
25const WAV_ATRAC3P_GUID: u128 = 0x62cee401faff19a14471cb58e923aabf;
26
27pub struct Decoder<R: Read + Seek> {
28    bit_reader: BitReader<R, BigEndian>,
29    spec: Spec,
30    context: Context,
31    frame: Frame,
32}
33
34impl<R: Read + Seek> Decoder<R> {
35    pub fn new(reader: R) -> Result<Decoder<R>, Error> {
36        let riff_reader = RiffWaveReader::new(reader)?;
37
38        let spec = get_spec_from_riff(&riff_reader)?;
39
40        if !(spec.block_align > 0) {
41            return Err(Error::BlockAlignNotSet);
42        }
43
44        let bit_reader = BitReader::new(riff_reader.into_reader());
45
46        init_static();
47
48        let mut context = Context::default();
49
50        context.gainc_ctx = GCContext::init(6, 2);
51
52        set_channel_params(&mut context, &spec)?;
53
54        for i in 0..context.num_channel_blocks as usize {
55            let mut ch_unit = ChannelUnit::default();
56
57            for ch in 0..2 {
58                ch_unit.channels[ch].ch_num = ch as i32;
59            }
60
61            context.ch_units[i] = Some(ch_unit);
62        }
63
64        let frame = Frame::new();
65
66        Ok(Decoder {
67            bit_reader,
68            spec,
69            context,
70            frame,
71        })
72    }
73
74    fn next_frame(&mut self) -> Result<(), Error> {
75        let block_align = self.spec.block_align as f32;
76        let data_size = self.spec.data_size;
77        let file_size = self.spec.file_size;
78
79        take_mut::take(&mut self.bit_reader, |bit_reader| {
80            align_to_block(bit_reader, block_align, data_size, file_size).unwrap()
81        });
82
83        decode_frame(&mut self.bit_reader, &mut self.context, &mut self.frame)?;
84
85        Ok(())
86    }
87}
88
89impl<R: Read + Seek> Iterator for Decoder<R> {
90    type Item = f32;
91
92    fn next(&mut self) -> Option<Self::Item> {
93        let remaining_samples: usize = self.frame.samples.iter().map(|v| v.len()).sum();
94
95        if remaining_samples == 0 {
96            self.frame.channel_to_interleave = 0;
97
98            if let Err(e) = self.next_frame() {
99                if let Error::IOError(e) = e {
100                    if e.kind() == std::io::ErrorKind::UnexpectedEof {
101                        log::info!(
102                            "END OF SONG, {} frames processed",
103                            self.context.frame_number,
104                        );
105                    } else {
106                        log::error!("IO ERROR: {:?}", e.kind());
107                    }
108                    return None;
109                } else {
110                    //println!("{}", self.context.ch_units[0].as_ref().unwrap());
111                    log::error!("ERROR frame {}: {}", self.context.frame_number, e);
112                    //panic!();
113                }
114
115                self.next()
116            } else {
117                self.next()
118            }
119        } else {
120            let sample = self.frame.samples[self.frame.channel_to_interleave as usize].remove(0);
121
122            self.frame.channel_to_interleave =
123                (self.frame.channel_to_interleave + 1) % self.frame.samples.len() as u8;
124
125            Some(sample)
126        }
127    }
128}
129
130impl<R: Read + Seek> rodio::Source for Decoder<R> {
131    #[inline]
132    fn current_frame_len(&self) -> Option<usize> {
133        Some(self.frame.samples.iter().map(|v| v.len()).sum())
134    }
135
136    #[inline]
137    fn channels(&self) -> u16 {
138        self.spec.channels
139    }
140
141    #[inline]
142    fn sample_rate(&self) -> u32 {
143        self.spec.sample_rate
144    }
145
146    #[inline]
147    fn total_duration(&self) -> Option<std::time::Duration> {
148        let millis = (1000 * self.spec.data_size as u64 * 8) / (self.spec.byte_rate as u64 * 8);
149        Some(std::time::Duration::from_millis(millis))
150    }
151}
152
153#[derive(Debug, Clone, Copy)]
154struct Spec {
155    file_size: u32,
156    data_size: u32,
157    channels: u16,
158    sample_rate: u32,
159    block_align: u16,
160    bits_per_coded_sample: u16,
161    channel_mask: u32,
162    byte_rate: u32,
163}
164
165fn get_spec_from_riff<R: Read + Seek>(riff_reader: &RiffWaveReader<R>) -> Result<Spec, Error> {
166    let extended_info = riff_reader
167        .fmt_chunk
168        .extended_info
169        .as_ref()
170        .ok_or(Error::RiffErrorNoExtendedInfo)?;
171
172    if extended_info.sub_format != WAV_ATRAC3P_GUID {
173        return Err(Error::NotAtrac3PlusFile);
174    };
175
176    let spec = Spec {
177        file_size: riff_reader.riff_chunk.file_size + 8,
178        data_size: riff_reader.data_chunk.data_size,
179        channels: riff_reader.fmt_chunk.num_channels,
180        sample_rate: riff_reader.fmt_chunk.sample_rate,
181        block_align: riff_reader.fmt_chunk.block_align,
182        bits_per_coded_sample: extended_info.bits_per_coded_sample,
183        channel_mask: extended_info.channel_mask,
184        byte_rate: riff_reader.fmt_chunk.byte_rate,
185    };
186
187    Ok(spec)
188}
189
190struct Context {
191    samples: [[f32; FRAME_SAMPLES]; 2],
192    mdct_buf: [[f32; FRAME_SAMPLES]; 2],
193    time_buf: [[f32; FRAME_SAMPLES]; 2],
194    outp_buf: [[f32; FRAME_SAMPLES]; 2],
195    ch_units: [Option<ChannelUnit>; 5],
196    num_channel_blocks: u8,
197    num_channels: u8,
198    channel_blocks: [Option<ChannelUnitType>; 5],
199    gainc_ctx: GCContext,
200    frame_number: u64,
201}
202
203impl Default for Context {
204    fn default() -> Self {
205        Context {
206            samples: [[0.0; FRAME_SAMPLES]; 2],
207            mdct_buf: [[0.0; FRAME_SAMPLES]; 2],
208            time_buf: [[0.0; FRAME_SAMPLES]; 2],
209            outp_buf: [[0.0; FRAME_SAMPLES]; 2],
210            ch_units: [None; 5],
211            num_channel_blocks: Default::default(),
212            num_channels: Default::default(),
213            channel_blocks: [None; 5],
214            gainc_ctx: Default::default(),
215            frame_number: Default::default(),
216        }
217    }
218}
219
220#[derive(Default)]
221struct GCContext {
222    gain_tab1: [f32; 16],
223    gain_tab2: [f32; 31],
224    id2exp_offset: i32,
225    loc_scale: i32,
226    loc_size: i32,
227}
228
229impl GCContext {
230    fn init(id2exp_offset: i32, loc_scale: i32) -> Self {
231        let mut gctx = Self::default();
232
233        gctx.loc_scale = loc_scale;
234        gctx.loc_size = 1 << loc_scale;
235        gctx.id2exp_offset = id2exp_offset;
236
237        for i in 0..16 {
238            gctx.gain_tab1[i] = (2.0 as f32).powf(id2exp_offset as f32 - i as f32);
239        }
240
241        let mut i: i32 = -15;
242        while i < 16 {
243            gctx.gain_tab2[(i + 15) as usize] =
244                (2.0 as f32).powf(-1.0 / gctx.loc_size as f32 * i as f32);
245            i += 1;
246        }
247
248        gctx
249    }
250}
251
252fn set_channel_params(ctx: &mut Context, spec: &Spec) -> Result<(), Error> {
253    ctx.num_channels = spec.channels as u8;
254
255    match ctx.num_channels {
256        1 => {
257            ctx.channel_blocks[0] = Some(ChannelUnitType::Mono);
258            ctx.num_channel_blocks = 1;
259        }
260        2 => {
261            ctx.channel_blocks[0] = Some(ChannelUnitType::Stereo);
262            ctx.num_channel_blocks = 1;
263        }
264        3 => {
265            ctx.channel_blocks[0] = Some(ChannelUnitType::Stereo);
266            ctx.channel_blocks[1] = Some(ChannelUnitType::Mono);
267            ctx.num_channel_blocks = 2;
268        }
269        4 => {
270            ctx.channel_blocks[0] = Some(ChannelUnitType::Stereo);
271            ctx.channel_blocks[1] = Some(ChannelUnitType::Mono);
272            ctx.channel_blocks[2] = Some(ChannelUnitType::Mono);
273            ctx.num_channel_blocks = 3;
274        }
275        6 => {
276            ctx.channel_blocks[0] = Some(ChannelUnitType::Stereo);
277            ctx.channel_blocks[1] = Some(ChannelUnitType::Mono);
278            ctx.channel_blocks[2] = Some(ChannelUnitType::Stereo);
279            ctx.channel_blocks[3] = Some(ChannelUnitType::Mono);
280            ctx.num_channel_blocks = 4;
281        }
282        7 => {
283            ctx.channel_blocks[0] = Some(ChannelUnitType::Stereo);
284            ctx.channel_blocks[1] = Some(ChannelUnitType::Mono);
285            ctx.channel_blocks[2] = Some(ChannelUnitType::Stereo);
286            ctx.channel_blocks[3] = Some(ChannelUnitType::Mono);
287            ctx.channel_blocks[4] = Some(ChannelUnitType::Mono);
288            ctx.num_channel_blocks = 5;
289        }
290        8 => {
291            ctx.channel_blocks[0] = Some(ChannelUnitType::Stereo);
292            ctx.channel_blocks[1] = Some(ChannelUnitType::Mono);
293            ctx.channel_blocks[2] = Some(ChannelUnitType::Stereo);
294            ctx.channel_blocks[3] = Some(ChannelUnitType::Stereo);
295            ctx.channel_blocks[4] = Some(ChannelUnitType::Mono);
296            ctx.num_channel_blocks = 5;
297        }
298        _ => {
299            return Err(Error::UnsupportedChannelCount(spec.channels));
300        }
301    }
302
303    Ok(())
304}
305
306#[derive(Debug, Clone, Copy, PartialEq)]
307enum ChannelUnitType {
308    Mono,
309    Stereo,
310    Extension,
311    Terminator,
312}
313
314impl Default for ChannelUnitType {
315    fn default() -> ChannelUnitType {
316        ChannelUnitType::Mono
317    }
318}
319
320impl ChannelUnitType {
321    fn from_bits(bits: u8) -> Result<ChannelUnitType, Error> {
322        match bits {
323            0 => Ok(ChannelUnitType::Mono),
324            1 => Ok(ChannelUnitType::Stereo),
325            2 => Ok(ChannelUnitType::Extension),
326            3 => Ok(ChannelUnitType::Terminator),
327            _ => Err(Error::InvalidChannelUnitTypeBits),
328        }
329    }
330}
331
332#[derive(Clone, Copy)]
333struct ChannelUnit {
334    unit_type: ChannelUnitType,
335    num_quant_units: i32,
336    num_subbands: u8,
337    used_quant_units: i32,
338    num_coded_subbands: u8,
339    mute_flag: i32,
340    use_full_table: i32,
341    noise_present: i32,
342    noise_level_index: i32,
343    noise_table_index: i32,
344    swap_channels: [u8; SUBBANDS],
345    negate_coeffs: [u8; SUBBANDS],
346    channels: [ChannelParams; 2],
347    waves_info: WaveSynthParams,
348    waves_info_prev: WaveSynthParams,
349    ipqf_ctx: [IPQFChannelCtx; 2],
350    prev_buf: [[f32; FRAME_SAMPLES]; 2],
351}
352
353impl Default for ChannelUnit {
354    fn default() -> Self {
355        ChannelUnit {
356            unit_type: Default::default(),
357            num_quant_units: Default::default(),
358            num_subbands: Default::default(),
359            used_quant_units: Default::default(),
360            num_coded_subbands: Default::default(),
361            mute_flag: Default::default(),
362            use_full_table: Default::default(),
363            noise_present: Default::default(),
364            noise_level_index: Default::default(),
365            noise_table_index: Default::default(),
366            swap_channels: Default::default(),
367            negate_coeffs: Default::default(),
368            channels: Default::default(),
369            waves_info: Default::default(),
370            waves_info_prev: Default::default(),
371            ipqf_ctx: [Default::default(); 2],
372            prev_buf: [[0.0; FRAME_SAMPLES]; 2],
373        }
374    }
375}
376
377#[derive(Default, Clone, Copy)]
378struct IPQFChannelCtx {
379    buf1: [[f32; 8]; PQF_FIR_LEN * 2],
380    buf2: [[f32; 8]; PQF_FIR_LEN * 2],
381    pos: i32,
382}
383
384struct Frame {
385    samples: Vec<Vec<f32>>,
386    channel_to_interleave: u8,
387}
388
389impl Frame {
390    fn new() -> Frame {
391        Frame {
392            samples: vec![],
393            channel_to_interleave: 0,
394        }
395    }
396}
397
398fn decode_frame<'a, R: Read + Seek>(
399    mut bit_reader: &'a mut BitReader<R, BigEndian>,
400    mut ctx: &'a mut Context,
401    frame: &'a mut Frame,
402) -> Result<(), Error> {
403    frame.samples.drain(..);
404
405    let start_marker = bit_reader.read_bit()?;
406
407    // False = bit 0, start marker must be 0
408    if start_marker {
409        return Err(Error::InvalidStartBit);
410    }
411
412    ctx.frame_number += 1;
413
414    let mut ch_block = 0usize;
415    let mut ch_unit_type = ChannelUnitType::from_bits(bit_reader.read(2)?)?;
416    while ch_unit_type != ChannelUnitType::Terminator {
417        if ch_unit_type == ChannelUnitType::Extension {
418            return Err(Error::UnsupportedChannelUnitExtension);
419        }
420
421        let mut channel_unit =
422            &mut ctx.ch_units[ch_block]
423                .as_mut()
424                .ok_or(Error::OtherFormat(format!(
425                    "Terminator not reached, tried accessing ch_block: {}",
426                    ch_block
427                )))?;
428        channel_unit.unit_type = ch_unit_type;
429        let channels_to_process: usize = match ch_unit_type {
430            ChannelUnitType::Mono => 0,
431            ChannelUnitType::Stereo => 1,
432            _ => 0,
433        } + 1;
434
435        decode_channel_unit(&mut bit_reader, &mut channel_unit, channels_to_process)?;
436
437        decode_residual_spectrum(&mut channel_unit, &mut ctx.samples, channels_to_process)?;
438
439        reconstruct_frame(&mut ctx, ch_block, channels_to_process)?;
440
441        for i in 0..channels_to_process {
442            frame.samples.push(ctx.outp_buf[i].to_vec());
443        }
444
445        ch_block += 1;
446        ch_unit_type = ChannelUnitType::from_bits(bit_reader.read(2)?)?;
447    }
448
449    Ok(())
450}
451
452fn decode_channel_unit<'a, R: Read + Seek>(
453    bit_reader: &'a mut BitReader<R, BigEndian>,
454    mut channel_unit: &'a mut ChannelUnit,
455    num_channels: usize,
456) -> Result<(), Error> {
457    channel_unit.num_quant_units = bit_reader.read::<i32>(5)? + 1;
458
459    if channel_unit.num_quant_units > 28 && channel_unit.num_quant_units < 32 {
460        return Err(Error::OtherFormat(format!(
461            "Invalid number of quantization units: {}!",
462            channel_unit.num_quant_units
463        )));
464    }
465
466    channel_unit.mute_flag = bit_reader.read::<i32>(1)?;
467
468    decode_quant_wordlen(bit_reader, &mut channel_unit, num_channels)?;
469
470    channel_unit.num_subbands = QU_TO_SUBBAND[channel_unit.num_quant_units as usize - 1] + 1;
471    channel_unit.num_coded_subbands = if channel_unit.used_quant_units > 0 {
472        QU_TO_SUBBAND[channel_unit.used_quant_units as usize - 1] + 1
473    } else {
474        0
475    };
476
477    decode_scale_factors(bit_reader, &mut channel_unit, num_channels)?;
478
479    decode_code_table_indexes(bit_reader, &mut channel_unit, num_channels)?;
480
481    decode_spectrum(bit_reader, &mut channel_unit, num_channels)?;
482
483    if num_channels == 2 {
484        get_subband_flags(
485            bit_reader,
486            &mut channel_unit.swap_channels,
487            channel_unit.num_coded_subbands as usize,
488        )?;
489
490        get_subband_flags(
491            bit_reader,
492            &mut channel_unit.negate_coeffs,
493            channel_unit.num_coded_subbands as usize,
494        )?;
495    }
496
497    decode_window_shape(bit_reader, &mut channel_unit, num_channels)?;
498
499    decode_gainc_data(bit_reader, &mut channel_unit, num_channels)?;
500
501    decode_tones_info(bit_reader, &mut channel_unit, num_channels)?;
502
503    channel_unit.noise_present = bit_reader.read::<i32>(1)?;
504    if channel_unit.noise_present > 0 {
505        channel_unit.noise_level_index = bit_reader.read::<i32>(4)?;
506        channel_unit.noise_table_index = bit_reader.read::<i32>(4)?;
507    }
508
509    Ok(())
510}
511
512fn decode_quant_wordlen<'a, R: Read + Seek>(
513    bit_reader: &'a mut BitReader<R, BigEndian>,
514    channel_unit: &'a mut ChannelUnit,
515    num_channels: usize,
516) -> Result<(), Error> {
517    for ch_num in 0..num_channels {
518        for i in 0..channel_unit.channels[ch_num].qu_wordlen.len() {
519            channel_unit.channels[ch_num].qu_wordlen[i] = 0;
520        }
521
522        decode_channel_wordlen(bit_reader, channel_unit, ch_num)?;
523    }
524
525    let mut i = channel_unit.num_quant_units - 1;
526    while i >= 0 {
527        if channel_unit.channels[0].qu_wordlen[i as usize] > 0
528            || (num_channels == 2 && channel_unit.channels[1].qu_wordlen[i as usize] > 0)
529        {
530            break;
531        }
532
533        i -= 1;
534    }
535    channel_unit.used_quant_units = i + 1;
536
537    Ok(())
538}
539
540fn decode_channel_wordlen<'a, R: Read + Seek>(
541    bit_reader: &'a mut BitReader<R, BigEndian>,
542    channel_unit: &'a mut ChannelUnit,
543    ch_num: usize,
544) -> Result<(), Error> {
545    let mut weight_index: Option<u8> = None;
546
547    channel_unit.channels[ch_num].fill_mode = 0;
548
549    let coding_mode = bit_reader.read::<u8>(2)?;
550    match coding_mode {
551        0 => {
552            for i in 0..channel_unit.num_quant_units {
553                let mut chan = &mut channel_unit.channels[ch_num];
554
555                chan.qu_wordlen[i as usize] = bit_reader.read::<i32>(3)?;
556            }
557        }
558        1 => {
559            if ch_num > 0 {
560                num_coded_units(bit_reader, ch_num, channel_unit)?;
561
562                let ref_chan = channel_unit.channels[0];
563                let mut chan = &mut channel_unit.channels[ch_num];
564
565                if chan.num_coded_vals > 0 {
566                    let vlc_sel = bit_reader.read::<u8>(2)? as usize;
567                    let vlc_tab = &WL_VLC_TABS[vlc_sel];
568
569                    for i in 0..chan.num_coded_vals as usize {
570                        let delta = bit_reader.read_huffman(&vlc_tab)?;
571                        chan.qu_wordlen[i] = (ref_chan.qu_wordlen[i] + delta) & 7;
572                    }
573                }
574            } else {
575                weight_index = Some(bit_reader.read::<u8>(2)?);
576
577                num_coded_units(bit_reader, ch_num, channel_unit)?;
578
579                let mut chan = &mut channel_unit.channels[ch_num];
580
581                if chan.num_coded_vals > 0 {
582                    let pos = bit_reader.read::<i32>(5)?;
583
584                    if pos > chan.num_coded_vals {
585                        return Err(Error::Other("WL mode 1: invalid position!"));
586                    }
587
588                    let delta_bits = bit_reader.read::<u8>(2)?;
589                    let min_value = bit_reader.read::<u16>(3)?;
590
591                    for i in 0..pos as usize {
592                        chan.qu_wordlen[i] = bit_reader.read::<i32>(3)?;
593                    }
594
595                    for i in pos..chan.num_coded_vals {
596                        chan.qu_wordlen[i as usize] =
597                            (min_value as i32 + bit_reader.read::<i32>(delta_bits as _)?) & 7;
598                    }
599                }
600            }
601        }
602        2 => {
603            num_coded_units(bit_reader, ch_num, channel_unit)?;
604
605            let ref_chan = channel_unit.channels[0];
606            let mut chan = &mut channel_unit.channels[ch_num];
607
608            if ch_num > 0 && chan.num_coded_vals > 0 {
609                let vlc_tab = &WL_VLC_TABS[bit_reader.read::<u8>(2)? as usize];
610                let delta = bit_reader.read_huffman(&vlc_tab)?;
611                chan.qu_wordlen[0] = (ref_chan.qu_wordlen[0] + delta) & 7;
612
613                for i in 1..chan.num_coded_vals as usize {
614                    let diff = ref_chan.qu_wordlen[i] - ref_chan.qu_wordlen[i - 1];
615                    let delta = bit_reader.read_huffman(&vlc_tab)?;
616                    chan.qu_wordlen[i] = (chan.qu_wordlen[i - 1] + diff + delta) & 7;
617                }
618            } else if chan.num_coded_vals > 0 {
619                let flag = bit_reader.read_bit()?;
620                let vlc_tab = &WL_VLC_TABS[bit_reader.read::<u8>(1)? as usize];
621
622                let start_val = bit_reader.read::<u8>(3)?;
623                unpack_vq_shape(
624                    start_val,
625                    &WL_SHAPES[start_val as usize][bit_reader.read::<u8>(4)? as usize],
626                    &mut chan.qu_wordlen,
627                    chan.num_coded_vals as _,
628                );
629
630                if !flag {
631                    for i in 0..chan.num_coded_vals as usize {
632                        let delta = bit_reader.read_huffman(&vlc_tab)?;
633                        chan.qu_wordlen[i] = (chan.qu_wordlen[i] + delta) & 7;
634                    }
635                } else {
636                    let mut i = 0usize;
637                    while i < (chan.num_coded_vals as isize & -2) as usize {
638                        if !bit_reader.read_bit()? {
639                            chan.qu_wordlen[i as usize] = (chan.qu_wordlen[i as usize]
640                                + bit_reader.read_huffman(&vlc_tab)? as i32)
641                                & 7;
642
643                            chan.qu_wordlen[i as usize + 1] = (chan.qu_wordlen[i as usize + 1]
644                                + bit_reader.read_huffman(&vlc_tab)? as i32)
645                                & 7;
646                        }
647
648                        i += 2;
649                    }
650
651                    if chan.num_coded_vals & 1 > 0 {
652                        chan.qu_wordlen[i as usize] = (chan.qu_wordlen[i as usize]
653                            + bit_reader.read_huffman(&vlc_tab)? as i32)
654                            & 7;
655                    }
656                }
657            }
658        }
659        3 => {
660            weight_index = Some(bit_reader.read::<u8>(2)?);
661
662            num_coded_units(bit_reader, ch_num, channel_unit)?;
663
664            let mut chan = &mut channel_unit.channels[ch_num];
665
666            if chan.num_coded_vals > 0 {
667                let vlc_tab = &WL_VLC_TABS[bit_reader.read::<u8>(2)? as usize];
668
669                chan.qu_wordlen[0] = bit_reader.read::<i32>(3)?;
670
671                for i in 1..chan.num_coded_vals as usize {
672                    let delta = bit_reader.read_huffman(&vlc_tab)?;
673                    chan.qu_wordlen[i] = (chan.qu_wordlen[i - 1] + delta) & 7;
674                }
675            }
676        }
677        _ => {} //unreachable
678    }
679
680    {
681        let mut chan = &mut channel_unit.channels[ch_num];
682
683        if chan.fill_mode == 2 {
684            for i in chan.num_coded_vals..channel_unit.num_quant_units {
685                chan.qu_wordlen[i as usize] = if ch_num > 0 {
686                    bit_reader.read::<i32>(1)?
687                } else {
688                    1
689                }
690            }
691        } else if chan.fill_mode == 3 {
692            let mut pos = if ch_num > 0 {
693                chan.num_coded_vals + chan.split_point
694            } else {
695                channel_unit.num_quant_units - chan.split_point
696            } as usize;
697
698            if pos > ff_array_elems(&chan.qu_wordlen) {
699                pos = ff_array_elems(&chan.qu_wordlen);
700            }
701
702            for i in chan.num_coded_vals as usize..pos {
703                chan.qu_wordlen[i] = 1;
704            }
705        }
706    }
707
708    if let Some(idx) = weight_index {
709        if idx > 0 {
710            add_wordlen_weights(channel_unit, ch_num, idx as usize)?
711        }
712    }
713
714    Ok(())
715}
716
717fn num_coded_units<'a, R: Read + Seek>(
718    bit_reader: &'a mut BitReader<R, BigEndian>,
719    ch_num: usize,
720    channel_unit: &'a mut ChannelUnit,
721) -> Result<(), Error> {
722    let mut chan = &mut channel_unit.channels[ch_num];
723
724    chan.fill_mode = bit_reader.read::<i32>(2)?;
725
726    if !(chan.fill_mode > 0) {
727        chan.num_coded_vals = channel_unit.num_quant_units;
728    } else {
729        chan.num_coded_vals = bit_reader.read::<i32>(5)?;
730
731        if chan.num_coded_vals > channel_unit.num_quant_units {
732            return Err(Error::Other("Invalid number of transmitted units!"));
733        }
734
735        if chan.fill_mode == 3 {
736            let bits = bit_reader.read::<i32>(2)?;
737            chan.split_point = bits + (chan.ch_num << 1) + 1;
738        }
739    }
740
741    Ok(())
742}
743
744fn add_wordlen_weights<'a>(
745    channel_unit: &'a mut ChannelUnit,
746    ch_num: usize,
747    wtab_idx: usize,
748) -> Result<(), Error> {
749    let mut chan = &mut channel_unit.channels[ch_num];
750
751    let weights_tab = &WL_WEIGHTS[chan.ch_num as usize * 3 + wtab_idx - 1];
752
753    for i in 0..channel_unit.num_quant_units {
754        chan.qu_wordlen[i as usize] += weights_tab[i as usize] as i32;
755
756        if chan.qu_wordlen[i as usize] < 0 || chan.qu_wordlen[i as usize] > 7 {
757            return Err(Error::OtherFormat(format!(
758                "WL index out of range: pos={}, val={}!",
759                i, chan.qu_wordlen[i as usize],
760            )));
761        }
762    }
763
764    Ok(())
765}
766
767fn unpack_vq_shape(start_val: u8, shape_vec: &[i16], dst: &mut [i32], num_values: usize) {
768    if num_values > 0 {
769        dst[0] = start_val as _;
770        dst[1] = start_val as _;
771        dst[2] = start_val as _;
772
773        for i in 3..num_values {
774            dst[i] = start_val as i32 - shape_vec[QU_NUM_TO_SEG[i] as usize - 1] as i32;
775        }
776    }
777}
778
779fn decode_scale_factors<'a, R: Read + Seek>(
780    bit_reader: &'a mut BitReader<R, BigEndian>,
781    channel_unit: &'a mut ChannelUnit,
782    num_channels: usize,
783) -> Result<(), Error> {
784    if !(channel_unit.used_quant_units > 0) {
785        return Ok(());
786    }
787
788    for ch_num in 0..num_channels {
789        for i in 0..channel_unit.channels[ch_num].qu_sf_idx.len() {
790            channel_unit.channels[ch_num].qu_sf_idx[i] = 0;
791        }
792
793        decode_channel_sf_idx(bit_reader, channel_unit, ch_num)?;
794    }
795
796    Ok(())
797}
798
799fn decode_channel_sf_idx<'a, R: Read + Seek>(
800    bit_reader: &'a mut BitReader<R, BigEndian>,
801    channel_unit: &'a mut ChannelUnit,
802    ch_num: usize,
803) -> Result<(), Error> {
804    let mut weight_index: Option<u8> = None;
805
806    let coding_mode = bit_reader.read::<u8>(2)?;
807    match coding_mode {
808        0 => {
809            let mut chan = &mut channel_unit.channels[ch_num];
810
811            for i in 0..channel_unit.used_quant_units as usize {
812                chan.qu_sf_idx[i] = bit_reader.read::<i32>(6)?;
813            }
814        }
815        1 => {
816            if ch_num > 0 {
817                let vlc_tab = &SF_VLC_TABS[bit_reader.read::<u8>(2)? as usize];
818
819                let ref_chan = channel_unit.channels[0];
820                let mut chan = &mut channel_unit.channels[ch_num];
821
822                for i in 0..channel_unit.used_quant_units as usize {
823                    let delta = bit_reader.read_huffman(&vlc_tab)?;
824                    chan.qu_sf_idx[i] = (ref_chan.qu_sf_idx[i] + delta) & 0x3F;
825                }
826            } else {
827                weight_index = Some(bit_reader.read::<u8>(2)?);
828                if weight_index.unwrap() == 3 {
829                    let mut chan = &mut channel_unit.channels[ch_num];
830
831                    let start_val = bit_reader.read::<u8>(6)?;
832                    unpack_vq_shape(
833                        start_val,
834                        &SF_SHAPES[bit_reader.read::<u8>(6)? as usize],
835                        &mut chan.qu_sf_idx,
836                        channel_unit.used_quant_units as usize,
837                    );
838
839                    let num_long_vals = bit_reader.read::<i32>(5)?;
840                    let delta_bits = bit_reader.read::<u8>(2)?;
841                    let min_val = bit_reader.read::<i32>(4)? - 7;
842
843                    for i in 0..num_long_vals as usize {
844                        chan.qu_sf_idx[i] =
845                            (chan.qu_sf_idx[i] + bit_reader.read::<i32>(4)? - 7) & 0x3F;
846                    }
847
848                    for i in num_long_vals..channel_unit.used_quant_units {
849                        chan.qu_sf_idx[i as usize] = (chan.qu_sf_idx[i as usize]
850                            + min_val
851                            + bit_reader.read::<i32>(delta_bits as _)?)
852                            & 0x3F;
853                    }
854                } else {
855                    let num_long_vals = bit_reader.read::<i32>(5)?;
856                    let delta_bits = bit_reader.read::<u32>(3)?;
857                    let min_val = bit_reader.read::<i32>(6)?;
858
859                    if num_long_vals > channel_unit.used_quant_units || delta_bits == 7 {
860                        return Err(Error::Other("SF mode 1: invalid parameters!"));
861                    }
862
863                    let mut chan = &mut channel_unit.channels[ch_num];
864
865                    for i in 0..num_long_vals as usize {
866                        chan.qu_sf_idx[i] = bit_reader.read::<i32>(6)?;
867                    }
868
869                    for i in num_long_vals..channel_unit.used_quant_units {
870                        chan.qu_sf_idx[i as usize] =
871                            (min_val + bit_reader.read::<i32>(delta_bits)?) & 0x3F;
872                    }
873                }
874            }
875        }
876        2 => {
877            if ch_num > 0 {
878                let vlc_tab = &SF_VLC_TABS[bit_reader.read::<u8>(2)? as usize];
879
880                let ref_chan = channel_unit.channels[0];
881                let mut chan = &mut channel_unit.channels[ch_num];
882
883                let mut delta = bit_reader.read_huffman(&vlc_tab)?;
884                chan.qu_sf_idx[0] = (ref_chan.qu_sf_idx[0] + delta) & 0x3F;
885
886                for i in 1..channel_unit.used_quant_units as usize {
887                    let diff = ref_chan.qu_sf_idx[i] - ref_chan.qu_sf_idx[i - 1];
888                    delta = bit_reader.read_huffman(&vlc_tab)?;
889                    chan.qu_sf_idx[i] = (chan.qu_sf_idx[i - 1] + diff + delta) & 0x3F;
890                }
891            } else {
892                let vlc_tab = &SF_VLC_TABS[bit_reader.read::<u8>(2)? as usize + 4];
893
894                let mut chan = &mut channel_unit.channels[ch_num];
895
896                let start_val = bit_reader.read::<u8>(6)?;
897                unpack_vq_shape(
898                    start_val,
899                    &SF_SHAPES[bit_reader.read::<u8>(6)? as usize],
900                    &mut chan.qu_sf_idx,
901                    channel_unit.used_quant_units as usize,
902                );
903
904                for i in 0..channel_unit.used_quant_units as usize {
905                    let delta = bit_reader.read_huffman::<i32>(&vlc_tab)?;
906                    chan.qu_sf_idx[i] = (chan.qu_sf_idx[i] + sign_extend(delta, 4)) & 0x3F;
907                }
908            }
909        }
910        3 => {
911            if ch_num > 0 {
912                let ref_chan = channel_unit.channels[0];
913                let mut chan = &mut channel_unit.channels[ch_num];
914
915                for i in 0..channel_unit.used_quant_units {
916                    chan.qu_sf_idx[i as usize] = ref_chan.qu_sf_idx[i as usize];
917                }
918            } else {
919                let mut chan = &mut channel_unit.channels[ch_num];
920
921                weight_index = Some(bit_reader.read::<u8>(2)?);
922                let vlc_sel = bit_reader.read::<u8>(2)? as usize;
923                let mut vlc_tab = &SF_VLC_TABS[vlc_sel];
924
925                if weight_index.unwrap() == 3 {
926                    vlc_tab = &SF_VLC_TABS[vlc_sel + 4];
927
928                    let start_val = bit_reader.read::<u8>(6)?;
929                    unpack_vq_shape(
930                        start_val,
931                        &SF_SHAPES[bit_reader.read::<u8>(6)? as usize],
932                        &mut chan.qu_sf_idx,
933                        channel_unit.used_quant_units as usize,
934                    );
935
936                    let mut diff = (bit_reader.read::<i32>(4)? + 56) & 0x3F;
937                    chan.qu_sf_idx[0] = (chan.qu_sf_idx[0] + diff) & 0x3F;
938
939                    for i in 1..channel_unit.used_quant_units {
940                        let delta = bit_reader.read_huffman(&vlc_tab)?;
941                        diff = (diff + sign_extend(delta, 4)) & 0x3F;
942                        chan.qu_sf_idx[i as usize] = (diff + chan.qu_sf_idx[i as usize]) & 0x3F;
943                    }
944                } else {
945                    chan.qu_sf_idx[0] = bit_reader.read::<i32>(6)?;
946
947                    for i in 1..channel_unit.used_quant_units {
948                        let delta = bit_reader.read_huffman(&vlc_tab)?;
949                        chan.qu_sf_idx[i as usize] =
950                            (chan.qu_sf_idx[i as usize - 1] + delta) & 0x3F;
951                    }
952                }
953            }
954        }
955        _ => {} // unreachable
956    }
957
958    if let Some(idx) = weight_index {
959        if idx > 0 && idx < 3 {
960            subtract_sf_weights(channel_unit, ch_num, idx as usize)?;
961        }
962    }
963
964    Ok(())
965}
966
967fn subtract_sf_weights<'a>(
968    channel_unit: &'a mut ChannelUnit,
969    ch_num: usize,
970    wtab_idx: usize,
971) -> Result<(), Error> {
972    let mut chan = &mut channel_unit.channels[ch_num];
973
974    let weights_tab = &SF_WEIGHTS[wtab_idx - 1];
975
976    for i in 0..channel_unit.used_quant_units {
977        chan.qu_sf_idx[i as usize] -= weights_tab[i as usize] as i32;
978
979        if chan.qu_sf_idx[i as usize] < 0 || chan.qu_sf_idx[i as usize] > 63 {
980            return Err(Error::OtherFormat(format!(
981                "SF index out of range: pos={}, val={}!",
982                i, chan.qu_sf_idx[i as usize]
983            )));
984        }
985    }
986
987    Ok(())
988}
989
990fn decode_code_table_indexes<'a, R: Read + Seek>(
991    bit_reader: &'a mut BitReader<R, BigEndian>,
992    channel_unit: &'a mut ChannelUnit,
993    num_channels: usize,
994) -> Result<(), Error> {
995    if !(channel_unit.used_quant_units > 0) {
996        return Ok(());
997    }
998
999    channel_unit.use_full_table = bit_reader.read::<i32>(1)?;
1000
1001    for ch_num in 0..num_channels {
1002        for i in 0..channel_unit.channels[ch_num].qu_tab_idx.len() {
1003            channel_unit.channels[ch_num].qu_tab_idx[i] = 0;
1004        }
1005
1006        decode_channel_code_tab(bit_reader, channel_unit, ch_num)?;
1007    }
1008
1009    Ok(())
1010}
1011
1012fn decode_channel_code_tab<'a, R: Read + Seek>(
1013    bit_reader: &'a mut BitReader<R, BigEndian>,
1014    channel_unit: &'a mut ChannelUnit,
1015    ch_num: usize,
1016) -> Result<(), Error> {
1017    let mask = if channel_unit.use_full_table > 0 {
1018        7
1019    } else {
1020        3
1021    };
1022
1023    let mut pred = 0;
1024
1025    {
1026        let mut chan = &mut channel_unit.channels[ch_num];
1027        chan.table_type = bit_reader.read::<i32>(1)?;
1028    }
1029
1030    let coding_mode = bit_reader.read::<i32>(2)?;
1031    match coding_mode {
1032        0 => {
1033            let num_bits = channel_unit.use_full_table as u32 + 2;
1034
1035            let operation = CodeTabOperation::Direct { num_bits };
1036            dec_ct_idx_common(bit_reader, channel_unit, ch_num, mask, &mut pred, operation)?;
1037        }
1038        1 => {
1039            let vlc_tab = if channel_unit.use_full_table > 0 {
1040                &CT_VLC_TABS[1]
1041            } else {
1042                &CT_VLC_TABS[0]
1043            };
1044
1045            let operation = CodeTabOperation::Vlc { vlc_tab };
1046            dec_ct_idx_common(bit_reader, channel_unit, ch_num, mask, &mut pred, operation)?;
1047        }
1048        2 => {
1049            let (vlc_tab, delta_vlc_tab) = if channel_unit.use_full_table > 0 {
1050                (&CT_VLC_TABS[1], &CT_VLC_TABS[2])
1051            } else {
1052                (&CT_VLC_TABS[0], &CT_VLC_TABS[0])
1053            };
1054
1055            let operation = CodeTabOperation::VlcDelta {
1056                vlc_tab,
1057                delta_vlc_tab,
1058            };
1059            dec_ct_idx_common(bit_reader, channel_unit, ch_num, mask, &mut pred, operation)?;
1060        }
1061        3 => {
1062            if ch_num > 0 {
1063                let vlc_tab = if channel_unit.use_full_table > 0 {
1064                    &CT_VLC_TABS[3]
1065                } else {
1066                    &CT_VLC_TABS[0]
1067                };
1068
1069                let operation = CodeTabOperation::VlcDiff { vlc_tab };
1070                dec_ct_idx_common(bit_reader, channel_unit, ch_num, mask, &mut pred, operation)?;
1071            }
1072        }
1073        _ => {} // unreachable
1074    }
1075
1076    Ok(())
1077}
1078
1079fn get_subband_flags<'a, R: Read + Seek>(
1080    bit_reader: &'a mut BitReader<R, BigEndian>,
1081    out: &mut [u8],
1082    num_flags: usize,
1083) -> Result<(), Error> {
1084    for i in 0..num_flags {
1085        out[i] = 0;
1086    }
1087
1088    let result = bit_reader.read_bit()?;
1089    if result {
1090        if bit_reader.read_bit()? {
1091            for i in 0..num_flags {
1092                out[i] = bit_reader.read::<u8>(1)?;
1093            }
1094        } else {
1095            for i in 0..num_flags {
1096                out[i] = 1;
1097            }
1098        }
1099    }
1100
1101    Ok(())
1102}
1103
1104enum CodeTabOperation<'a> {
1105    Direct {
1106        num_bits: u32,
1107    },
1108    Vlc {
1109        vlc_tab: &'a [ReadHuffmanTree<BigEndian, i32>],
1110    },
1111    VlcDelta {
1112        vlc_tab: &'a [ReadHuffmanTree<BigEndian, i32>],
1113        delta_vlc_tab: &'a [ReadHuffmanTree<BigEndian, i32>],
1114    },
1115    VlcDiff {
1116        vlc_tab: &'a [ReadHuffmanTree<BigEndian, i32>],
1117    },
1118}
1119
1120impl<'a> CodeTabOperation<'a> {
1121    fn get_idx<R: Read + Seek>(
1122        &self,
1123        bit_reader: &'a mut BitReader<R, BigEndian>,
1124        ref_chan: ChannelParams,
1125        i: usize,
1126        mask: i32,
1127        pred: &'a mut i32,
1128    ) -> Result<i32, Error> {
1129        match self {
1130            CodeTabOperation::Direct { num_bits } => Ok(bit_reader.read::<i32>(*num_bits)?),
1131            CodeTabOperation::Vlc { vlc_tab } => Ok(bit_reader.read_huffman(vlc_tab)?),
1132            CodeTabOperation::VlcDelta {
1133                vlc_tab,
1134                delta_vlc_tab,
1135            } => {
1136                *pred = if !(i > 0) {
1137                    bit_reader.read_huffman(vlc_tab)?
1138                } else {
1139                    (*pred + bit_reader.read_huffman(delta_vlc_tab)?) & mask
1140                };
1141                Ok(*pred)
1142            }
1143            CodeTabOperation::VlcDiff { vlc_tab } => {
1144                Ok((ref_chan.qu_tab_idx[i] + bit_reader.read_huffman(vlc_tab)?) & mask)
1145            }
1146        }
1147    }
1148}
1149
1150fn dec_ct_idx_common<'a, R: Read + Seek>(
1151    bit_reader: &'a mut BitReader<R, BigEndian>,
1152    channel_unit: &'a mut ChannelUnit,
1153    ch_num: usize,
1154    mask: i32,
1155    mut pred: &'a mut i32,
1156    operation: CodeTabOperation,
1157) -> Result<(), Error> {
1158    let num_vals = get_num_ct_values(bit_reader, channel_unit)?;
1159
1160    let ref_chan = channel_unit.channels[0];
1161    let mut chan = &mut channel_unit.channels[ch_num];
1162
1163    for i in 0..num_vals as usize {
1164        if chan.qu_wordlen[i] > 0 {
1165            chan.qu_tab_idx[i] = operation.get_idx(bit_reader, ref_chan, i, mask, &mut pred)?;
1166        } else if ch_num > 0 && ref_chan.qu_wordlen[i] > 0 {
1167            chan.qu_tab_idx[i] = bit_reader.read::<i32>(1)?;
1168        }
1169    }
1170
1171    Ok(())
1172}
1173
1174fn get_num_ct_values<'a, R: Read + Seek>(
1175    bit_reader: &'a mut BitReader<R, BigEndian>,
1176    channel_unit: &'a mut ChannelUnit,
1177) -> Result<i32, Error> {
1178    if bit_reader.read_bit()? {
1179        let num_coded_vals = bit_reader.read::<i32>(5)?;
1180        if num_coded_vals > channel_unit.used_quant_units {
1181            return Err(Error::OtherFormat(format!(
1182                "Invalid number of code table indexes: {}!",
1183                num_coded_vals
1184            )));
1185        }
1186
1187        Ok(num_coded_vals)
1188    } else {
1189        Ok(channel_unit.used_quant_units)
1190    }
1191}
1192
1193fn decode_spectrum<'a, R: Read + Seek>(
1194    bit_reader: &'a mut BitReader<R, BigEndian>,
1195    channel_unit: &'a mut ChannelUnit,
1196    num_channels: usize,
1197) -> Result<(), Error> {
1198    let mut num_specs;
1199
1200    for ch_num in 0..num_channels {
1201        {
1202            let chan = &mut channel_unit.channels[ch_num];
1203
1204            for i in 0..chan.spectrum.len() {
1205                chan.spectrum[i] = 0;
1206            }
1207
1208            for i in 0..chan.power_levs.len() {
1209                chan.power_levs[i] = POWER_COMP_OFF;
1210            }
1211        }
1212
1213        for qu in 0..channel_unit.used_quant_units as usize {
1214            num_specs = QU_TO_SPEC_POS[qu + 1] - QU_TO_SPEC_POS[qu];
1215
1216            let wordlen = channel_unit.channels[ch_num].qu_wordlen[qu];
1217            let mut codetab = channel_unit.channels[ch_num].qu_tab_idx[qu];
1218
1219            if wordlen > 0 {
1220                let chan = &mut channel_unit.channels[ch_num];
1221
1222                if !(channel_unit.use_full_table > 0) {
1223                    codetab = CT_RESTRICTED_TO_FULL[chan.table_type as usize][wordlen as usize - 1]
1224                        [codetab as usize] as i32;
1225                }
1226
1227                let mut tab_index = (chan.table_type * 8 + codetab) * 7 + wordlen - 1;
1228                let tab = &SPECTRA_TABS[tab_index as usize];
1229
1230                if tab.redirect >= 0 {
1231                    tab_index = tab.redirect;
1232                }
1233
1234                let out_idx = QU_TO_SPEC_POS[qu] as usize;
1235                let out = &mut chan.spectrum[out_idx..];
1236
1237                decode_qu_spectra(
1238                    bit_reader,
1239                    tab,
1240                    &SPEC_VLC_TABS[tab_index as usize],
1241                    out,
1242                    num_specs as usize,
1243                )?;
1244            } else if ch_num > 0 && channel_unit.channels[0].qu_wordlen[qu] > 0 && !(codetab > 0) {
1245                {
1246                    let src_chan = channel_unit.channels[0];
1247                    let src = &src_chan.spectrum[QU_TO_SPEC_POS[qu] as usize..];
1248
1249                    let chan = &mut channel_unit.channels[ch_num];
1250                    let dst = &mut chan.spectrum[QU_TO_SPEC_POS[qu] as usize..];
1251
1252                    for i in 0..src.len() {
1253                        dst[i] = src[i];
1254                    }
1255                }
1256
1257                let src_chan = channel_unit.channels[0];
1258                let mut chan = &mut channel_unit.channels[ch_num];
1259                chan.qu_wordlen[qu] = src_chan.qu_wordlen[qu];
1260            }
1261        }
1262
1263        if channel_unit.used_quant_units > 2 {
1264            let mut chan = &mut channel_unit.channels[ch_num];
1265
1266            num_specs = SUBBAND_TO_NUM_POWGRPS[channel_unit.num_coded_subbands as usize - 1] as u16;
1267            for i in 0..num_specs as usize {
1268                chan.power_levs[i] = bit_reader.read::<u8>(4)?;
1269            }
1270        }
1271    }
1272
1273    Ok(())
1274}
1275
1276fn decode_qu_spectra<'a, R: Read + Seek>(
1277    bit_reader: &'a mut BitReader<R, BigEndian>,
1278    tab: &'a SpecCodeTab,
1279    vlc_tab: &'a Option<Box<[ReadHuffmanTree<BigEndian, u16>]>>,
1280    out: &'a mut [i16],
1281    num_specs: usize,
1282) -> Result<(), Error> {
1283    let group_size = tab.group_size;
1284    let num_coeffs = tab.num_coeffs;
1285    let bits = tab.bits;
1286    let is_signed = tab.is_signed;
1287
1288    let mut pos = 0;
1289    while pos < num_specs {
1290        if group_size == 1 || bit_reader.read_bit()? {
1291            for _ in 0..group_size {
1292                // NEED TO RESEARCH, NULL VLC_TAB
1293                let mut val = if let Some(tab) = vlc_tab {
1294                    bit_reader.read_huffman(tab)?
1295                } else {
1296                    0
1297                } as i32;
1298
1299                for _ in 0..num_coeffs {
1300                    let mut cf = val & ((1 << bits) - 1);
1301
1302                    if is_signed > 0 {
1303                        cf = sign_extend(val, bits as usize);
1304                    } else if cf > 0 && bit_reader.read_bit()? {
1305                        cf = -cf;
1306                    }
1307
1308                    out[pos] = cf as i16;
1309                    pos += 1;
1310
1311                    val >>= bits;
1312                }
1313            }
1314        } else {
1315            pos += (group_size * num_coeffs) as usize;
1316        }
1317    }
1318
1319    Ok(())
1320}
1321
1322fn decode_window_shape<'a, R: Read + Seek>(
1323    bit_reader: &'a mut BitReader<R, BigEndian>,
1324    channel_unit: &'a mut ChannelUnit,
1325    num_channels: usize,
1326) -> Result<(), Error> {
1327    for ch_num in 0..num_channels {
1328        get_subband_flags(
1329            bit_reader,
1330            &mut channel_unit.channels[ch_num].wnd_shape,
1331            channel_unit.num_subbands as usize,
1332        )?;
1333    }
1334
1335    Ok(())
1336}
1337
1338fn decode_gainc_data<'a, R: Read + Seek>(
1339    bit_reader: &'a mut BitReader<R, BigEndian>,
1340    channel_unit: &'a mut ChannelUnit,
1341    num_channels: usize,
1342) -> Result<(), Error> {
1343    for ch_num in 0..num_channels {
1344        for i in 0..channel_unit.channels[ch_num].gain_data.len() {
1345            channel_unit.channels[ch_num].gain_data[i] = GainInfo::default();
1346        }
1347
1348        if bit_reader.read_bit()? {
1349            let coded_subbands = bit_reader.read::<i32>(4)? + 1;
1350
1351            if bit_reader.read_bit()? {
1352                channel_unit.channels[ch_num].num_gain_subbands = bit_reader.read::<i32>(4)? + 1;
1353            } else {
1354                channel_unit.channels[ch_num].num_gain_subbands = coded_subbands;
1355            }
1356
1357            decode_gainc_npoints(bit_reader, channel_unit, ch_num, coded_subbands as usize)?;
1358            decode_gainc_levels(bit_reader, channel_unit, ch_num, coded_subbands as usize)?;
1359            decode_gainc_loc_codes(bit_reader, channel_unit, ch_num, coded_subbands as usize)?;
1360
1361            if coded_subbands > 0 {
1362                for sb in coded_subbands..channel_unit.channels[ch_num].num_gain_subbands {
1363                    channel_unit.channels[ch_num].gain_data[sb as usize] =
1364                        channel_unit.channels[ch_num].gain_data[sb as usize - 1];
1365                }
1366            }
1367        } else {
1368            channel_unit.channels[ch_num].num_gain_subbands = 0;
1369        }
1370    }
1371
1372    Ok(())
1373}
1374
1375fn decode_gainc_npoints<'a, R: Read + Seek>(
1376    bit_reader: &'a mut BitReader<R, BigEndian>,
1377    channel_unit: &'a mut ChannelUnit,
1378    ch_num: usize,
1379    coded_subbands: usize,
1380) -> Result<(), Error> {
1381    let ref_chan = channel_unit.channels[0];
1382    let mut chan = &mut channel_unit.channels[ch_num];
1383
1384    let coding_mode = bit_reader.read::<u8>(2)?;
1385    match coding_mode {
1386        0 => {
1387            for i in 0..coded_subbands {
1388                chan.gain_data[i].num_points = bit_reader.read::<i32>(3)?;
1389            }
1390        }
1391        1 => {
1392            for i in 0..coded_subbands {
1393                let vlc_tab = &GAIN_VLC_TABS[0];
1394                chan.gain_data[i].num_points = bit_reader.read_huffman(&vlc_tab)? as i32;
1395            }
1396        }
1397        2 => {
1398            if ch_num > 0 {
1399                for i in 0..coded_subbands {
1400                    let vlc_tab = &GAIN_VLC_TABS[1];
1401                    let delta = bit_reader.read_huffman(&vlc_tab)? as i32;
1402
1403                    chan.gain_data[i].num_points = (ref_chan.gain_data[i].num_points + delta) & 7;
1404                }
1405            } else {
1406                let vlc_tab = &GAIN_VLC_TABS[0];
1407                chan.gain_data[0].num_points = bit_reader.read_huffman(&vlc_tab)? as i32;
1408
1409                for i in 1..coded_subbands {
1410                    let vlc_tab = &GAIN_VLC_TABS[1];
1411                    let delta = bit_reader.read_huffman(&vlc_tab)? as i32;
1412
1413                    chan.gain_data[i].num_points = (chan.gain_data[i - 1].num_points + delta) & 7;
1414                }
1415            }
1416        }
1417        3 => {
1418            if ch_num > 0 {
1419                for i in 0..coded_subbands {
1420                    chan.gain_data[i].num_points = ref_chan.gain_data[i].num_points;
1421                }
1422            } else {
1423                let delta_bits = bit_reader.read::<u32>(2)?;
1424                let min_val = bit_reader.read::<i32>(3)?;
1425
1426                for i in 0..coded_subbands {
1427                    chan.gain_data[i].num_points = min_val + bit_reader.read::<i32>(delta_bits)?;
1428
1429                    if chan.gain_data[i].num_points > 7 {
1430                        return Err(Error::InvalidData);
1431                    }
1432                }
1433            }
1434        }
1435        _ => {} // unreachable
1436    }
1437
1438    Ok(())
1439}
1440
1441fn decode_gainc_levels<'a, R: Read + Seek>(
1442    bit_reader: &'a mut BitReader<R, BigEndian>,
1443    channel_unit: &'a mut ChannelUnit,
1444    ch_num: usize,
1445    coded_subbands: usize,
1446) -> Result<(), Error> {
1447    let ref_chan = channel_unit.channels[0];
1448    let mut chan = &mut channel_unit.channels[ch_num];
1449
1450    let coding_mode = bit_reader.read::<u8>(2)?;
1451    match coding_mode {
1452        0 => {
1453            for sb in 0..coded_subbands {
1454                for i in 0..chan.gain_data[sb].num_points as usize {
1455                    chan.gain_data[sb].lev_code[i] = bit_reader.read::<i32>(4)?;
1456                }
1457            }
1458        }
1459        1 => {
1460            if ch_num > 0 {
1461                for sb in 0..coded_subbands {
1462                    for i in 0..chan.gain_data[sb].num_points as usize {
1463                        let vlc_tab = &GAIN_VLC_TABS[5];
1464                        let delta = bit_reader.read_huffman(vlc_tab)?;
1465
1466                        let pred = if i >= ref_chan.gain_data[sb].num_points as usize {
1467                            7
1468                        } else {
1469                            ref_chan.gain_data[sb].lev_code[i]
1470                        };
1471
1472                        chan.gain_data[sb].lev_code[i] = (pred + delta as i32) & 0xF;
1473                    }
1474                }
1475            } else {
1476                for sb in 0..coded_subbands {
1477                    // mode1m
1478                    {
1479                        let dst = &mut chan.gain_data[sb];
1480
1481                        if dst.num_points > 0 {
1482                            let vlc_tab = &GAIN_VLC_TABS[2];
1483                            dst.lev_code[0] = bit_reader.read_huffman(vlc_tab)? as i32;
1484                        }
1485
1486                        for i in 1..dst.num_points as usize {
1487                            let vlc_tab = &GAIN_VLC_TABS[3];
1488                            let delta = bit_reader.read_huffman(vlc_tab)? as i32;
1489
1490                            dst.lev_code[i] = (dst.lev_code[i - 1] + delta) & 0xF;
1491                        }
1492                    }
1493                }
1494            }
1495        }
1496        2 => {
1497            if ch_num > 0 {
1498                for sb in 0..coded_subbands {
1499                    if chan.gain_data[sb].num_points > 0 {
1500                        if bit_reader.read_bit()? {
1501                            // mode1m
1502                            {
1503                                let dst = &mut chan.gain_data[sb];
1504
1505                                if dst.num_points > 0 {
1506                                    let vlc_tab = &GAIN_VLC_TABS[2];
1507                                    dst.lev_code[0] = bit_reader.read_huffman(vlc_tab)? as i32;
1508                                }
1509
1510                                for i in 1..dst.num_points as usize {
1511                                    let vlc_tab = &GAIN_VLC_TABS[3];
1512                                    let delta = bit_reader.read_huffman(vlc_tab)? as i32;
1513
1514                                    dst.lev_code[i] = (dst.lev_code[i - 1] + delta) & 0xF;
1515                                }
1516                            }
1517                        } else {
1518                            // mode3s
1519                            {
1520                                let _ref = &ref_chan.gain_data[sb];
1521                                let dst = &mut chan.gain_data[sb];
1522
1523                                for i in 0..dst.num_points as usize {
1524                                    dst.lev_code[i] = if i >= _ref.num_points as usize {
1525                                        7
1526                                    } else {
1527                                        _ref.lev_code[i]
1528                                    };
1529                                }
1530                            }
1531                        }
1532                    }
1533                }
1534            } else {
1535                if chan.gain_data[0].num_points > 0 {
1536                    // mode1m
1537                    {
1538                        let dst = &mut chan.gain_data[0];
1539
1540                        if dst.num_points > 0 {
1541                            let vlc_tab = &GAIN_VLC_TABS[2];
1542                            dst.lev_code[0] = bit_reader.read_huffman(vlc_tab)? as i32;
1543                        }
1544
1545                        for i in 1..dst.num_points as usize {
1546                            let vlc_tab = &GAIN_VLC_TABS[3];
1547                            let delta = bit_reader.read_huffman(vlc_tab)? as i32;
1548
1549                            dst.lev_code[i] = (dst.lev_code[i - 1] + delta) & 0xF;
1550                        }
1551                    }
1552                }
1553
1554                for sb in 1..coded_subbands {
1555                    for i in 0..chan.gain_data[sb].num_points as usize {
1556                        let vlc_tab = &GAIN_VLC_TABS[4];
1557                        let delta = bit_reader.read_huffman(vlc_tab)? as i32;
1558
1559                        let pred = if i >= chan.gain_data[sb - 1].num_points as usize {
1560                            7
1561                        } else {
1562                            chan.gain_data[sb - 1].lev_code[i]
1563                        };
1564
1565                        chan.gain_data[sb].lev_code[i] = (pred + delta) & 0xF;
1566                    }
1567                }
1568            }
1569        }
1570        3 => {
1571            if ch_num > 0 {
1572                for sb in 0..coded_subbands {
1573                    // mode3s
1574                    {
1575                        let _ref = &ref_chan.gain_data[sb];
1576                        let dst = &mut chan.gain_data[sb];
1577
1578                        for i in 0..dst.num_points as usize {
1579                            dst.lev_code[i] = if i >= _ref.num_points as usize {
1580                                7
1581                            } else {
1582                                _ref.lev_code[i]
1583                            };
1584                        }
1585                    }
1586                }
1587            } else {
1588                let delta_bits = bit_reader.read::<u32>(2)?;
1589                let min_val = bit_reader.read::<i32>(4)?;
1590
1591                for sb in 0..coded_subbands {
1592                    for i in 0..chan.gain_data[sb].num_points as usize {
1593                        chan.gain_data[sb].lev_code[i] =
1594                            min_val + bit_reader.read::<i32>(delta_bits)?;
1595
1596                        if chan.gain_data[sb].lev_code[i] > 15 {
1597                            return Err(Error::InvalidData);
1598                        }
1599                    }
1600                }
1601            }
1602        }
1603        _ => {} // uncreachable
1604    }
1605
1606    Ok(())
1607}
1608
1609fn decode_gainc_loc_codes<'a, R: Read + Seek>(
1610    bit_reader: &'a mut BitReader<R, BigEndian>,
1611    channel_unit: &'a mut ChannelUnit,
1612    ch_num: usize,
1613    coded_subbands: usize,
1614) -> Result<(), Error> {
1615    let ref_chan = channel_unit.channels[0];
1616    let mut chan = &mut channel_unit.channels[ch_num];
1617
1618    let coding_mode = bit_reader.read::<u8>(2)?;
1619    match coding_mode {
1620        0 => {
1621            for sb in 0..coded_subbands {
1622                for i in 0..chan.gain_data[sb].num_points as usize {
1623                    //loc_mode0
1624                    {
1625                        let dst = &mut chan.gain_data[sb];
1626                        let pos = i;
1627
1628                        if !(pos > 0) || dst.loc_code[pos - 1] < 15 {
1629                            dst.loc_code[pos] = bit_reader.read::<i32>(5)?;
1630                        } else if dst.loc_code[pos - 1] >= 30 {
1631                            dst.loc_code[pos] = 31;
1632                        } else {
1633                            let delta_bits = log2(30 - dst.loc_code[pos - 1] as u32) + 1;
1634                            dst.loc_code[pos] = dst.loc_code[pos - 1]
1635                                + bit_reader.read::<i32>(delta_bits as u32)?
1636                                + 1;
1637                        }
1638                    }
1639                }
1640            }
1641        }
1642        1 => {
1643            if ch_num > 0 {
1644                for sb in 0..coded_subbands {
1645                    if chan.gain_data[sb].num_points <= 0 {
1646                        continue;
1647                    }
1648
1649                    let _ref = &ref_chan.gain_data[sb];
1650                    let dst = &mut chan.gain_data[sb];
1651
1652                    let vlc_tab = &GAIN_VLC_TABS[10];
1653                    let delta = bit_reader.read_huffman(vlc_tab)?;
1654
1655                    let pred = if _ref.num_points > 0 {
1656                        _ref.loc_code[0]
1657                    } else {
1658                        0
1659                    };
1660                    dst.loc_code[0] = (pred + delta as i32) & 0x1F;
1661
1662                    for i in 1..dst.num_points as usize {
1663                        let more_than_ref = i >= _ref.num_points as usize;
1664                        if dst.lev_code[i] > dst.lev_code[i - 1] {
1665                            if more_than_ref {
1666                                let vlc_tab = &GAIN_VLC_TABS[9];
1667                                let delta = bit_reader.read_huffman(vlc_tab)?;
1668
1669                                dst.loc_code[i] = dst.loc_code[i - 1] + delta as i32;
1670                            } else {
1671                                if bit_reader.read_bit()? {
1672                                    //loc_mode0
1673                                    {
1674                                        let pos = i;
1675
1676                                        if !(pos > 0) || dst.loc_code[pos - 1] < 15 {
1677                                            dst.loc_code[pos] = bit_reader.read::<i32>(5)?;
1678                                        } else if dst.loc_code[pos - 1] >= 30 {
1679                                            dst.loc_code[pos] = 31;
1680                                        } else {
1681                                            let delta_bits =
1682                                                log2(30 - dst.loc_code[pos - 1] as u32) + 1;
1683                                            dst.loc_code[pos] = dst.loc_code[pos - 1]
1684                                                + bit_reader.read::<i32>(delta_bits as u32)?
1685                                                + 1;
1686                                        }
1687                                    }
1688                                } else {
1689                                    dst.loc_code[i] = _ref.loc_code[i];
1690                                }
1691                            }
1692                        } else {
1693                            let vlc_tab = if more_than_ref {
1694                                &GAIN_VLC_TABS[7]
1695                            } else {
1696                                &GAIN_VLC_TABS[10]
1697                            };
1698                            let delta = bit_reader.read_huffman(vlc_tab)?;
1699
1700                            if more_than_ref {
1701                                dst.loc_code[i] = dst.loc_code[i - 1] + delta as i32;
1702                            } else {
1703                                dst.loc_code[i] = (_ref.loc_code[i] + delta as i32) & 0x1F;
1704                            }
1705                        }
1706                    }
1707                }
1708            } else {
1709                for sb in 0..coded_subbands {
1710                    // loc_mode1
1711                    {
1712                        let dst = &mut chan.gain_data[sb];
1713
1714                        if dst.num_points > 0 {
1715                            dst.loc_code[0] = bit_reader.read::<i32>(5)?;
1716
1717                            for i in 1..dst.num_points as usize {
1718                                let vlc_tab = if dst.lev_code[i] <= dst.lev_code[i - 1] {
1719                                    &GAIN_VLC_TABS[7]
1720                                } else {
1721                                    &GAIN_VLC_TABS[9]
1722                                };
1723
1724                                dst.loc_code[i] =
1725                                    dst.loc_code[i - 1] + bit_reader.read_huffman(vlc_tab)? as i32;
1726                            }
1727                        }
1728                    }
1729                }
1730            }
1731        }
1732        2 => {
1733            if ch_num > 0 {
1734                for sb in 0..coded_subbands {
1735                    if chan.gain_data[sb].num_points <= 0 {
1736                        continue;
1737                    }
1738
1739                    let _ref = &ref_chan.gain_data[sb];
1740                    let dst = &mut chan.gain_data[sb];
1741
1742                    if dst.num_points > _ref.num_points || bit_reader.read_bit()? {
1743                        // loc_mode1
1744                        {
1745                            if dst.num_points > 0 {
1746                                dst.loc_code[0] = bit_reader.read::<i32>(5)?;
1747
1748                                for i in 1..dst.num_points as usize {
1749                                    let vlc_tab = if dst.lev_code[i] <= dst.lev_code[i - 1] {
1750                                        &GAIN_VLC_TABS[7]
1751                                    } else {
1752                                        &GAIN_VLC_TABS[9]
1753                                    };
1754
1755                                    dst.loc_code[i] = dst.loc_code[i - 1]
1756                                        + bit_reader.read_huffman(vlc_tab)? as i32;
1757                                }
1758                            }
1759                        }
1760                    } else {
1761                        for i in 0..dst.num_points as usize {
1762                            dst.loc_code[i] = _ref.loc_code[i];
1763                        }
1764                    }
1765                }
1766            } else {
1767                for i in 0..chan.gain_data[0].num_points as usize {
1768                    //loc_mode0
1769                    {
1770                        let dst = &mut chan.gain_data[0];
1771                        let pos = i;
1772
1773                        if !(pos > 0) || dst.loc_code[pos - 1] < 15 {
1774                            dst.loc_code[pos] = bit_reader.read::<i32>(5)?;
1775                        } else if dst.loc_code[pos - 1] >= 30 {
1776                            dst.loc_code[pos] = 31;
1777                        } else {
1778                            let delta_bits = log2(30 - dst.loc_code[pos - 1] as u32) + 1;
1779                            dst.loc_code[pos] = dst.loc_code[pos - 1]
1780                                + bit_reader.read::<i32>(delta_bits as u32)?
1781                                + 1;
1782                        }
1783                    }
1784                }
1785
1786                for sb in 1..coded_subbands {
1787                    if chan.gain_data[sb].num_points <= 0 {
1788                        continue;
1789                    }
1790
1791                    let mut vlc_tab = &GAIN_VLC_TABS[6];
1792                    let delta = bit_reader.read_huffman(vlc_tab)?;
1793
1794                    let pred = if chan.gain_data[sb - 1].num_points > 0 {
1795                        chan.gain_data[sb - 1].loc_code[0]
1796                    } else {
1797                        0
1798                    };
1799
1800                    {
1801                        let dst = &mut chan.gain_data[sb];
1802                        dst.loc_code[0] = (pred + delta as i32) & 0x1F;
1803                    }
1804
1805                    for i in 1..chan.gain_data[sb].num_points as usize {
1806                        let more_than_ref = i >= chan.gain_data[sb - 1].num_points as usize;
1807
1808                        vlc_tab = &GAIN_VLC_TABS[if chan.gain_data[sb].lev_code[i]
1809                            > chan.gain_data[sb].lev_code[i - 1]
1810                        {
1811                            1
1812                        } else {
1813                            0
1814                        } * 2
1815                            + if more_than_ref { 1 } else { 0 }
1816                            + 6];
1817
1818                        let delta = bit_reader.read_huffman(vlc_tab)? as i32;
1819
1820                        if more_than_ref {
1821                            chan.gain_data[sb].loc_code[i] =
1822                                chan.gain_data[sb].loc_code[i - 1] + delta;
1823                        } else {
1824                            chan.gain_data[sb].loc_code[i] =
1825                                (chan.gain_data[sb - 1].loc_code[i] + delta) & 0x1F;
1826                        }
1827                    }
1828                }
1829            }
1830        }
1831        3 => {
1832            if ch_num > 0 {
1833                for sb in 0..coded_subbands {
1834                    for i in 0..chan.gain_data[sb].num_points as usize {
1835                        if i >= ref_chan.gain_data[sb].num_points as usize {
1836                            //loc_mode0
1837                            {
1838                                let dst = &mut chan.gain_data[sb];
1839                                let pos = i;
1840
1841                                if !(pos > 0) || dst.loc_code[pos - 1] < 15 {
1842                                    dst.loc_code[pos] = bit_reader.read::<i32>(5)?;
1843                                } else if dst.loc_code[pos - 1] >= 30 {
1844                                    dst.loc_code[pos] = 31;
1845                                } else {
1846                                    let delta_bits = log2(30 - dst.loc_code[pos - 1] as u32) + 1;
1847                                    dst.loc_code[pos] = dst.loc_code[pos - 1]
1848                                        + bit_reader.read::<i32>(delta_bits as u32)?
1849                                        + 1;
1850                                }
1851                            }
1852                        } else {
1853                            chan.gain_data[sb].loc_code[i] = ref_chan.gain_data[sb].loc_code[i];
1854                        }
1855                    }
1856                }
1857            } else {
1858                let delta_bits = bit_reader.read::<u32>(2)? + 1;
1859                let min_val = bit_reader.read::<i32>(5)?;
1860
1861                for sb in 0..coded_subbands {
1862                    for i in 0..chan.gain_data[sb].num_points as usize {
1863                        chan.gain_data[sb].loc_code[i] =
1864                            min_val + i as i32 + bit_reader.read::<i32>(delta_bits)?;
1865                    }
1866                }
1867            }
1868        }
1869        _ => {} // unreachable
1870    }
1871
1872    for sb in 0..coded_subbands {
1873        let dst = &chan.gain_data[sb];
1874
1875        for i in 0..dst.num_points as usize {
1876            if dst.loc_code[i] < 0
1877                || dst.loc_code[i] > 31
1878                || (i > 0 && dst.loc_code[i] <= dst.loc_code[i - 1])
1879            {
1880                return Err(Error::OtherFormat(format!(
1881                    "Invalid gain location: ch={} sb={} pos={} val={}",
1882                    ch_num, sb, i, dst.loc_code[i]
1883                )));
1884            }
1885        }
1886    }
1887
1888    Ok(())
1889}
1890
1891fn decode_tones_info<'a, R: Read + Seek>(
1892    bit_reader: &'a mut BitReader<R, BigEndian>,
1893    channel_unit: &'a mut ChannelUnit,
1894    num_channels: usize,
1895) -> Result<(), Error> {
1896    for ch_num in 0..num_channels {
1897        for i in 0..channel_unit.channels[ch_num].tones_info.len() {
1898            channel_unit.channels[ch_num].tones_info[i] = WavesData::default();
1899        }
1900    }
1901
1902    channel_unit.waves_info.tones_present = bit_reader.read::<i32>(1)?;
1903
1904    if !(channel_unit.waves_info.tones_present > 0) {
1905        return Ok(());
1906    }
1907
1908    for i in 0..channel_unit.waves_info.waves.len() {
1909        channel_unit.waves_info.waves[i] = WaveParam::default();
1910    }
1911
1912    channel_unit.waves_info.amplitude_mode = bit_reader.read::<i32>(1)?;
1913    if !(channel_unit.waves_info.amplitude_mode > 0) {
1914        return Err(Error::Other("GHA amplitude mode 0"));
1915    }
1916
1917    let vlc_tab = &TONE_VLC_TABS[0];
1918    channel_unit.waves_info.num_tone_bands = bit_reader.read_huffman(vlc_tab)? as i32 + 1;
1919
1920    if num_channels == 2 {
1921        get_subband_flags(
1922            bit_reader,
1923            &mut channel_unit.waves_info.tone_sharing,
1924            channel_unit.waves_info.num_tone_bands as usize,
1925        )?;
1926        get_subband_flags(
1927            bit_reader,
1928            &mut channel_unit.waves_info.tone_master,
1929            channel_unit.waves_info.num_tone_bands as usize,
1930        )?;
1931        get_subband_flags(
1932            bit_reader,
1933            &mut channel_unit.waves_info.invert_phase,
1934            channel_unit.waves_info.num_tone_bands as usize,
1935        )?;
1936    }
1937
1938    channel_unit.waves_info.tones_index = 0;
1939
1940    let mut band_has_tones = [0; 16];
1941    for ch_num in 0..num_channels {
1942        for i in 0..channel_unit.waves_info.num_tone_bands as usize {
1943            band_has_tones[i] = if !(ch_num > 0) {
1944                1
1945            } else {
1946                if channel_unit.waves_info.tone_sharing[i] > 0 {
1947                    0
1948                } else {
1949                    1
1950                }
1951            };
1952        }
1953
1954        decode_tones_envelope(bit_reader, channel_unit, ch_num, &band_has_tones)?;
1955        decode_band_numwavs(bit_reader, channel_unit, ch_num, &band_has_tones)?;
1956        decode_tones_frequency(bit_reader, channel_unit, ch_num, &band_has_tones)?;
1957        decode_tones_amplitude(bit_reader, channel_unit, ch_num, &band_has_tones)?;
1958        decode_tones_phase(bit_reader, channel_unit, ch_num, &band_has_tones)?;
1959    }
1960
1961    if num_channels == 2 {
1962        for i in 0..channel_unit.waves_info.num_tone_bands as usize {
1963            if channel_unit.waves_info.tone_sharing[i] > 0 {
1964                channel_unit.channels[1].tones_info[i] = channel_unit.channels[0].tones_info[i];
1965            }
1966
1967            if channel_unit.waves_info.tone_master[i] > 0 {
1968                let info_0 = channel_unit.channels[0].tones_info[i];
1969                let info_1 = channel_unit.channels[1].tones_info[i];
1970
1971                channel_unit.channels[0].tones_info[i] = info_1;
1972                channel_unit.channels[1].tones_info[i] = info_0;
1973            }
1974        }
1975    }
1976
1977    Ok(())
1978}
1979
1980fn decode_tones_envelope<'a, R: Read + Seek>(
1981    bit_reader: &'a mut BitReader<R, BigEndian>,
1982    channel_unit: &'a mut ChannelUnit,
1983    ch_num: usize,
1984    band_has_tones: &'a [i32],
1985) -> Result<(), Error> {
1986    if !(ch_num > 0) || !bit_reader.read_bit()? {
1987        let dst = &mut channel_unit.channels[ch_num].tones_info;
1988
1989        for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
1990            if !(band_has_tones[sb] > 0) {
1991                continue;
1992            }
1993
1994            dst[sb].pend_env.has_start_point = bit_reader.read::<i32>(1)?;
1995            dst[sb].pend_env.start_pos = if dst[sb].pend_env.has_start_point > 0 {
1996                bit_reader.read::<i32>(5)?
1997            } else {
1998                -1
1999            };
2000
2001            dst[sb].pend_env.has_stop_point = bit_reader.read::<i32>(1)?;
2002            dst[sb].pend_env.stop_pos = if dst[sb].pend_env.has_stop_point > 0 {
2003                bit_reader.read::<i32>(5)?
2004            } else {
2005                32
2006            };
2007        }
2008    } else {
2009        for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2010            if !(band_has_tones[sb] > 0) {
2011                continue;
2012            }
2013
2014            let has_start_point = channel_unit.channels[0].tones_info[sb]
2015                .pend_env
2016                .has_start_point;
2017            let start_pos = channel_unit.channels[0].tones_info[sb].pend_env.start_pos;
2018            let has_stop_point = channel_unit.channels[0].tones_info[sb]
2019                .pend_env
2020                .has_stop_point;
2021            let stop_pos = channel_unit.channels[0].tones_info[sb].pend_env.stop_pos;
2022
2023            let dst = &mut channel_unit.channels[ch_num].tones_info;
2024
2025            dst[sb].pend_env.has_start_point = has_start_point;
2026            dst[sb].pend_env.has_stop_point = has_stop_point;
2027            dst[sb].pend_env.start_pos = start_pos;
2028            dst[sb].pend_env.stop_pos = stop_pos;
2029        }
2030    }
2031
2032    Ok(())
2033}
2034
2035fn decode_band_numwavs<'a, R: Read + Seek>(
2036    bit_reader: &'a mut BitReader<R, BigEndian>,
2037    channel_unit: &'a mut ChannelUnit,
2038    ch_num: usize,
2039    band_has_tones: &'a [i32],
2040) -> Result<(), Error> {
2041    let mode = bit_reader.read::<u8>(ch_num as u32 + 1)?;
2042    match mode {
2043        0 => {
2044            let dst = &mut channel_unit.channels[ch_num].tones_info;
2045
2046            for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2047                if band_has_tones[sb] > 0 {
2048                    dst[sb].num_wavs = bit_reader.read::<i32>(4)?;
2049                }
2050            }
2051        }
2052        1 => {
2053            let dst = &mut channel_unit.channels[ch_num].tones_info;
2054
2055            for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2056                if band_has_tones[sb] > 0 {
2057                    let vlc_tab = &TONE_VLC_TABS[1];
2058                    dst[sb].num_wavs = bit_reader.read_huffman(&vlc_tab)? as i32;
2059                }
2060            }
2061        }
2062        2 => {
2063            for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2064                if band_has_tones[sb] > 0 {
2065                    let vlc_tab = &TONE_VLC_TABS[2];
2066                    let mut delta = bit_reader.read_huffman(&vlc_tab)? as i32;
2067                    delta = sign_extend(delta, 3);
2068
2069                    let ref_num_wavs = channel_unit.channels[0].tones_info[sb].num_wavs;
2070
2071                    let dst = &mut channel_unit.channels[ch_num].tones_info;
2072                    dst[sb].num_wavs = (ref_num_wavs + delta) & 0xF;
2073                }
2074            }
2075        }
2076        3 => {
2077            for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2078                if band_has_tones[sb] > 0 {
2079                    let ref_num_wavs = channel_unit.channels[0].tones_info[sb].num_wavs;
2080
2081                    let dst = &mut channel_unit.channels[ch_num].tones_info;
2082                    dst[sb].num_wavs = ref_num_wavs;
2083                }
2084            }
2085        }
2086        _ => {} // unreachable
2087    }
2088
2089    let dst = &mut channel_unit.channels[ch_num].tones_info;
2090
2091    for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2092        if band_has_tones[sb] > 0 {
2093            if channel_unit.waves_info.tones_index + dst[sb].num_wavs > 48 {
2094                return Err(Error::OtherFormat(format!(
2095                    // ADD NUM FRAMES TO CTX
2096                    "Too many tones: {} (max. 48), frame: UNIMPL!",
2097                    channel_unit.waves_info.tones_index + dst[sb].num_wavs
2098                )));
2099            }
2100
2101            dst[sb].start_index = channel_unit.waves_info.tones_index;
2102            channel_unit.waves_info.tones_index += dst[sb].num_wavs;
2103        }
2104    }
2105
2106    Ok(())
2107}
2108
2109fn decode_tones_frequency<'a, R: Read + Seek>(
2110    bit_reader: &'a mut BitReader<R, BigEndian>,
2111    channel_unit: &'a mut ChannelUnit,
2112    ch_num: usize,
2113    band_has_tones: &'a [i32],
2114) -> Result<(), Error> {
2115    if !(ch_num > 0) || !bit_reader.read_bit()? {
2116        let dst = &mut channel_unit.channels[ch_num].tones_info;
2117
2118        for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2119            if !(band_has_tones[sb] > 0) || !(dst[sb].num_wavs > 0) {
2120                continue;
2121            }
2122
2123            let mut iwav = &mut channel_unit.waves_info.waves[dst[sb].start_index as usize..];
2124            let direction = if dst[sb].num_wavs > 1 {
2125                bit_reader.read::<i32>(1)?
2126            } else {
2127                0
2128            };
2129
2130            if direction > 0 {
2131                if dst[sb].num_wavs > 0 {
2132                    iwav[dst[sb].num_wavs as usize - 1].freq_index = bit_reader.read::<i32>(10)?;
2133                }
2134
2135                let mut i = dst[sb].num_wavs - 2;
2136                while i >= 0 {
2137                    let nbits = log2(iwav[i as usize + 1].freq_index as u32) + 1;
2138                    iwav[i as usize].freq_index = bit_reader.read::<i32>(nbits as u32)?;
2139                    i -= 1;
2140                }
2141            } else {
2142                for i in 0..dst[sb].num_wavs as usize {
2143                    if !(i > 0) || iwav[i - 1].freq_index < 512 {
2144                        iwav[i].freq_index = bit_reader.read::<i32>(10)?;
2145                    } else {
2146                        let nbits = log2(1023 - iwav[i - 1].freq_index as u32) + 1;
2147                        iwav[i].freq_index =
2148                            bit_reader.read::<i32>(nbits as u32)? + 1024 - (1 << nbits);
2149                    }
2150                }
2151            }
2152        }
2153    } else {
2154        for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2155            if !(band_has_tones[sb] > 0)
2156                || !(channel_unit.channels[ch_num].tones_info[sb].num_wavs > 0)
2157            {
2158                continue;
2159            }
2160
2161            for i in 0..channel_unit.channels[ch_num].tones_info[sb].num_wavs as usize {
2162                let vlc_tab = &TONE_VLC_TABS[6];
2163                let mut delta = bit_reader.read_huffman(vlc_tab)? as i32;
2164                delta = sign_extend(delta, 8);
2165
2166                let iwav = &channel_unit.waves_info.waves
2167                    [channel_unit.channels[0].tones_info[sb].start_index as usize..];
2168                let ref_num_wavs = channel_unit.channels[0].tones_info[sb].num_wavs;
2169
2170                let pred = if i < ref_num_wavs as usize {
2171                    iwav[i].freq_index
2172                } else {
2173                    if ref_num_wavs > 0 {
2174                        iwav[ref_num_wavs as usize - 1].freq_index
2175                    } else {
2176                        0
2177                    }
2178                };
2179
2180                let owav = &mut channel_unit.waves_info.waves
2181                    [channel_unit.channels[ch_num].tones_info[sb].start_index as usize..];
2182                owav[i].freq_index = (pred + delta) & 0x3FF;
2183            }
2184        }
2185    }
2186
2187    Ok(())
2188}
2189
2190fn decode_tones_amplitude<'a, R: Read + Seek>(
2191    bit_reader: &'a mut BitReader<R, BigEndian>,
2192    channel_unit: &'a mut ChannelUnit,
2193    ch_num: usize,
2194    band_has_tones: &'a [i32],
2195) -> Result<(), Error> {
2196    let mut refwaves: [i32; 48] = [0; 48];
2197
2198    if ch_num > 0 {
2199        let _ref = &channel_unit.channels[0].tones_info;
2200        let dst = &channel_unit.channels[ch_num].tones_info;
2201
2202        for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2203            if !(band_has_tones[sb] > 0) || !(dst[sb].num_wavs > 0) {
2204                continue;
2205            }
2206
2207            let wsrc = &channel_unit.waves_info.waves[dst[sb].start_index as usize..];
2208            let wref = &channel_unit.waves_info.waves[_ref[sb].start_index as usize..];
2209
2210            let mut maxdiff = 1024;
2211            let mut fi = 0;
2212            for j in 0..dst[sb].num_wavs as usize {
2213                for i in 0.._ref[sb].num_wavs as usize {
2214                    let diff = (wsrc[j].freq_index - wref[i].freq_index).abs();
2215                    if diff < maxdiff {
2216                        maxdiff = diff;
2217                        fi = i as i32;
2218                    }
2219                }
2220
2221                if maxdiff < 0 {
2222                    refwaves[dst[sb].start_index as usize + j] = fi + _ref[sb].start_index;
2223                } else if j < _ref[sb].num_wavs as usize {
2224                    refwaves[dst[sb].start_index as usize + j] = j as i32 + _ref[sb].start_index;
2225                } else {
2226                    refwaves[dst[sb].start_index as usize + j] = -1;
2227                }
2228            }
2229        }
2230    }
2231
2232    let dst = &mut channel_unit.channels[ch_num].tones_info;
2233
2234    let mode = bit_reader.read::<u8>(ch_num as u32 + 1)?;
2235    match mode {
2236        0 => {
2237            for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2238                if !(band_has_tones[sb] > 0) || !(dst[sb].num_wavs > 0) {
2239                    continue;
2240                }
2241
2242                if channel_unit.waves_info.amplitude_mode > 0 {
2243                    for i in 0..dst[sb].num_wavs as usize {
2244                        channel_unit.waves_info.waves[dst[sb].start_index as usize + i].amp_sf =
2245                            bit_reader.read::<i32>(6)?;
2246                    }
2247                } else {
2248                    channel_unit.waves_info.waves[dst[sb].start_index as usize].amp_sf =
2249                        bit_reader.read::<i32>(6)?;
2250                }
2251            }
2252        }
2253        1 => {
2254            for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2255                if !(band_has_tones[sb] > 0) || !(dst[sb].num_wavs > 0) {
2256                    continue;
2257                }
2258
2259                if channel_unit.waves_info.amplitude_mode > 0 {
2260                    for i in 0..dst[sb].num_wavs as usize {
2261                        let vlc_tab = &TONE_VLC_TABS[3];
2262                        channel_unit.waves_info.waves[dst[sb].start_index as usize + i].amp_sf =
2263                            bit_reader.read_huffman(vlc_tab)? as i32 + 20;
2264                    }
2265                } else {
2266                    let vlc_tab = &TONE_VLC_TABS[4];
2267                    channel_unit.waves_info.waves[dst[sb].start_index as usize].amp_sf =
2268                        bit_reader.read_huffman(vlc_tab)? as i32 + 24;
2269                }
2270            }
2271        }
2272        2 => {
2273            for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2274                if !(band_has_tones[sb] > 0) || !(dst[sb].num_wavs > 0) {
2275                    continue;
2276                }
2277
2278                for i in 0..dst[sb].num_wavs as usize {
2279                    let vlc_tab = &TONE_VLC_TABS[5];
2280                    let mut delta = bit_reader.read_huffman(vlc_tab)? as i32;
2281                    delta = sign_extend(delta, 5);
2282                    let pred = if refwaves[dst[sb].start_index as usize + i] >= 0 {
2283                        channel_unit.waves_info.waves
2284                            [refwaves[dst[sb].start_index as usize + i] as usize]
2285                            .amp_sf
2286                    } else {
2287                        34
2288                    };
2289
2290                    channel_unit.waves_info.waves[dst[sb].start_index as usize + i].amp_sf =
2291                        (pred + delta) & 0x3F;
2292                }
2293            }
2294        }
2295        3 => {
2296            for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2297                if !(band_has_tones[sb] > 0) {
2298                    continue;
2299                }
2300
2301                for i in 0..dst[sb].num_wavs as usize {
2302                    channel_unit.waves_info.waves[dst[sb].start_index as usize + i].amp_sf =
2303                        if refwaves[dst[sb].start_index as usize + i] >= 0 {
2304                            channel_unit.waves_info.waves
2305                                [refwaves[dst[sb].start_index as usize + i] as usize]
2306                                .amp_sf
2307                        } else {
2308                            32
2309                        };
2310                }
2311            }
2312        }
2313        _ => {} // unreachable
2314    }
2315
2316    Ok(())
2317}
2318
2319fn decode_tones_phase<'a, R: Read + Seek>(
2320    bit_reader: &'a mut BitReader<R, BigEndian>,
2321    channel_unit: &'a mut ChannelUnit,
2322    ch_num: usize,
2323    band_has_tones: &'a [i32],
2324) -> Result<(), Error> {
2325    let dst = &channel_unit.channels[ch_num].tones_info;
2326
2327    for sb in 0..channel_unit.waves_info.num_tone_bands as usize {
2328        if !(band_has_tones[sb] > 0) {
2329            continue;
2330        }
2331
2332        let wparam = &mut channel_unit.waves_info.waves[dst[sb].start_index as usize..];
2333        for i in 0..dst[sb].num_wavs as usize {
2334            wparam[i].phase_index = bit_reader.read::<i32>(5)?;
2335        }
2336    }
2337
2338    Ok(())
2339}
2340
2341impl std::fmt::Display for ChannelUnit {
2342    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2343        writeln!(
2344            f,
2345            "--- Channel Block ---
2346Unit Type:        {:?}
2347Quant Units:      {}
2348Used Quant Units: {}
2349Mute Flag:        {}
2350# Subbands:       {}
2351# Coded Subbands: {}
2352Use Full Table:   {}
2353Noise Present:    {}
2354Noise Level Idx:  {}
2355Noise Table Idx:  {}
2356Swap Channels:    {:?}
2357Negate Coeffs:    {:?}
2358
2359------- Chn 0 -------
2360Coded Vals:       {}
2361Fill Mode:        {}
2362Split Point:      {}
2363Table Type:       {}
2364QU Wordlen:       {:?}
2365QU SF Idx:        {:?}
2366QU Tab Idx:       {:?}
2367Power Levels:     {:?}
2368Window Shape:     {:?}
2369Gain Data:        {:?}
2370# Gain Subbands:  {}
2371
2372------- Chn 1 -------
2373Coded Vals:       {}
2374Fill Mode:        {}
2375Split Point:      {}
2376Table Type:       {}
2377QU Wordlen:       {:?}
2378QU SF Idx:        {:?}
2379QU Tab Idx:       {:?}
2380Power Levels:     {:?}
2381Window Shape:     {:?}
2382Gain Data:        {:?}
2383# Gain Subbands:  {}
2384
2385----- Waves Info ----
2386Tones Present:    {}
2387Amplitude Mode:   {}
2388Num Tone Bands:   {}
2389Tone Sharing:     {:?}
2390Tone Master:      {:?}
2391Invert Phase:     {:?}",
2392            self.unit_type,
2393            self.num_quant_units,
2394            self.used_quant_units,
2395            self.mute_flag,
2396            self.num_subbands,
2397            self.num_coded_subbands,
2398            self.use_full_table,
2399            self.noise_present,
2400            self.noise_level_index,
2401            self.noise_table_index,
2402            self.swap_channels,
2403            self.negate_coeffs,
2404            self.channels[0].num_coded_vals,
2405            self.channels[0].fill_mode,
2406            self.channels[0].split_point,
2407            self.channels[0].table_type,
2408            self.channels[0].qu_wordlen,
2409            self.channels[0].qu_sf_idx,
2410            self.channels[0].qu_tab_idx,
2411            self.channels[0].power_levs,
2412            self.channels[0].wnd_shape,
2413            self.channels[0].gain_data,
2414            self.channels[0].num_gain_subbands,
2415            self.channels[1].num_coded_vals,
2416            self.channels[1].fill_mode,
2417            self.channels[1].split_point,
2418            self.channels[1].table_type,
2419            self.channels[1].qu_wordlen,
2420            self.channels[1].qu_sf_idx,
2421            self.channels[1].qu_tab_idx,
2422            self.channels[1].power_levs,
2423            self.channels[1].wnd_shape,
2424            self.channels[1].gain_data,
2425            self.channels[1].num_gain_subbands,
2426            self.waves_info.tones_present,
2427            self.waves_info.amplitude_mode,
2428            self.waves_info.num_tone_bands,
2429            self.waves_info.tone_sharing,
2430            self.waves_info.tone_master,
2431            self.waves_info.invert_phase,
2432        )?;
2433
2434        for ch in 0..2 {
2435            writeln!(f, "\nCh {} spectrum", ch)?;
2436            for x in self.channels[ch].spectrum.iter() {
2437                write!(f, ",{}", x)?;
2438            }
2439        }
2440
2441        Ok(())
2442    }
2443}
2444
2445const POWER_COMP_OFF: u8 = 15;
2446
2447#[derive(Clone, Copy)]
2448struct ChannelParams {
2449    ch_num: i32,
2450    num_coded_vals: i32,
2451    fill_mode: i32,
2452    split_point: i32,
2453    table_type: i32,
2454    qu_wordlen: [i32; 32],
2455    qu_sf_idx: [i32; 32],
2456    qu_tab_idx: [i32; 32],
2457    spectrum: [i16; 2048],
2458    power_levs: [u8; 5],
2459    wnd_shape: [u8; SUBBANDS],
2460    wnd_shape_prev: [u8; SUBBANDS],
2461    gain_data: [GainInfo; SUBBANDS],
2462    gain_data_prev: [GainInfo; SUBBANDS],
2463    num_gain_subbands: i32,
2464    tones_info: [WavesData; SUBBANDS],
2465    tones_info_prev: [WavesData; SUBBANDS],
2466}
2467
2468impl Default for ChannelParams {
2469    fn default() -> ChannelParams {
2470        ChannelParams {
2471            ch_num: Default::default(),
2472            num_coded_vals: Default::default(),
2473            fill_mode: Default::default(),
2474            split_point: Default::default(),
2475            table_type: Default::default(),
2476            qu_wordlen: Default::default(),
2477            qu_sf_idx: Default::default(),
2478            qu_tab_idx: Default::default(),
2479            spectrum: [0; 2048],
2480            power_levs: [POWER_COMP_OFF; 5],
2481            wnd_shape: Default::default(),
2482            wnd_shape_prev: Default::default(),
2483            gain_data: Default::default(),
2484            gain_data_prev: Default::default(),
2485            num_gain_subbands: Default::default(),
2486            tones_info: Default::default(),
2487            tones_info_prev: Default::default(),
2488        }
2489    }
2490}
2491
2492#[derive(Default, Clone, Copy)]
2493struct GainInfo {
2494    num_points: i32,
2495    lev_code: [i32; 7],
2496    loc_code: [i32; 7],
2497}
2498
2499impl std::fmt::Debug for GainInfo {
2500    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2501        Ok(write!(
2502            f,
2503            "({}, {:?}, {:?})",
2504            self.num_points, self.lev_code, self.loc_code
2505        )?)
2506    }
2507}
2508
2509#[derive(Clone, Copy)]
2510struct WaveSynthParams {
2511    tones_present: i32,
2512    amplitude_mode: i32,
2513    num_tone_bands: i32,
2514    tone_sharing: [u8; SUBBANDS],
2515    tone_master: [u8; SUBBANDS],
2516    invert_phase: [u8; SUBBANDS],
2517    tones_index: i32,
2518    waves: [WaveParam; 48],
2519}
2520
2521impl Default for WaveSynthParams {
2522    fn default() -> Self {
2523        WaveSynthParams {
2524            tones_present: Default::default(),
2525            amplitude_mode: Default::default(),
2526            num_tone_bands: Default::default(),
2527            tone_sharing: Default::default(),
2528            tone_master: Default::default(),
2529            invert_phase: Default::default(),
2530            tones_index: Default::default(),
2531            waves: [Default::default(); 48],
2532        }
2533    }
2534}
2535
2536#[derive(Default, Clone, Copy)]
2537struct WaveParam {
2538    freq_index: i32,
2539    amp_sf: i32,
2540    amp_index: i32,
2541    phase_index: i32,
2542}
2543
2544#[derive(Default, Clone, Copy)]
2545struct WavesData {
2546    pend_env: WavesEnvelope,
2547    curr_env: WavesEnvelope,
2548    num_wavs: i32,
2549    start_index: i32,
2550}
2551
2552#[derive(Default, Clone, Copy)]
2553struct WavesEnvelope {
2554    has_start_point: i32,
2555    has_stop_point: i32,
2556    start_pos: i32,
2557    stop_pos: i32,
2558}
2559
2560fn ff_array_elems<T>(a: &[T]) -> usize {
2561    std::mem::size_of_val(a) / std::mem::size_of_val(&a[0])
2562}
2563
2564fn sign_extend(val: i32, bits: usize) -> i32 {
2565    let shift = 8 * std::mem::size_of_val(&val) - bits;
2566    let v = SignExtend {
2567        u: (val << shift) as u32,
2568    };
2569
2570    let s = unsafe { v.s };
2571    s >> shift
2572}
2573
2574union SignExtend {
2575    u: u32,
2576    s: i32,
2577}
2578
2579fn log2(mut v: u32) -> i32 {
2580    let mut n = 0;
2581
2582    if v & 0xffff0000 > 0 {
2583        v >>= 16;
2584        n += 16;
2585    }
2586    if v & 0xff00 > 0 {
2587        v >>= 8;
2588        n += 8;
2589    }
2590    n += LOG2_TAB[v as usize] as i32;
2591
2592    n
2593}
2594
2595const LOG2_TAB: [u8; 256] = [
2596    0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
2597    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
2598    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2599    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2600    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
2601    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
2602    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
2603    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
2604];
2605
2606fn align_to_block<R: Read + Seek>(
2607    mut bit_reader: BitReader<R, BigEndian>,
2608    block_align: f32,
2609    data_size: u32,
2610    file_size: u32,
2611) -> Result<BitReader<R, BigEndian>, Error> {
2612    bit_reader.byte_align();
2613
2614    let mut reader = bit_reader.into_reader();
2615    let mut pos = reader.seek(SeekFrom::Current(0))? as u32;
2616
2617    let offset = file_size - data_size;
2618    pos -= offset;
2619
2620    let calc_blocks = pos as f32 / block_align;
2621    let next_block = calc_blocks.ceil();
2622
2623    let block_delta = next_block - calc_blocks;
2624    let bytes_to_align = block_align * block_delta;
2625
2626    reader.seek(SeekFrom::Current(bytes_to_align.round() as i64))?;
2627
2628    Ok(BitReader::new(reader))
2629}
2630
2631fn init_static() {
2632    lazy_static::initialize(&WL_VLC_TABS);
2633    lazy_static::initialize(&SF_VLC_TABS);
2634    lazy_static::initialize(&CT_VLC_TABS);
2635    lazy_static::initialize(&GAIN_VLC_TABS);
2636    lazy_static::initialize(&TONE_VLC_TABS);
2637    lazy_static::initialize(&SINE_64);
2638    lazy_static::initialize(&SINE_128);
2639    lazy_static::initialize(&SINE_TABLE);
2640    lazy_static::initialize(&HANN_WINDOW);
2641    lazy_static::initialize(&AMP_SF_TAB);
2642    lazy_static::initialize(&SPECTRA_TABS);
2643    lazy_static::initialize(&SPEC_VLC_TABS);
2644}