1use 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 log::error!("ERROR frame {}: {}", self.context.frame_number, e);
112 }
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 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 _ => {} }
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 _ => {} }
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 _ => {} }
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 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 _ => {} }
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 {
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 {
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 {
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 {
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 {
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 _ => {} }
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 {
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 {
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 {
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 {
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 {
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 {
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 _ => {} }
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 _ => {} }
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 "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 _ => {} }
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(&_SF_TAB);
2642 lazy_static::initialize(&SPECTRA_TABS);
2643 lazy_static::initialize(&SPEC_VLC_TABS);
2644}