aac: clear M/S flags
[nihav.git] / nihav-mpeg / src / codecs / aac / mod.rs
CommitLineData
999c25f7
KS
1use nihav_core::formats::*;
2use nihav_core::frame::*;
3use nihav_core::codecs::*;
4use nihav_codec_support::dsp::mdct::IMDCT;
5use nihav_codec_support::dsp::window::*;
6use nihav_core::io::bitreader::*;
7use nihav_core::io::byteio::*;
8use std::str::FromStr;
9
10mod coeff_read;
11use coeff_read::*;
12mod info;
13use info::*;
0e18270d
KS
14mod sbr;
15use sbr::{SBRHeader, SBRCodebooks, SBRState, SBRChannel, SBRDSP, sbr_read_sce, sbr_read_cpe};
27608aa6 16#[allow(clippy::excessive_precision)]
999c25f7
KS
17mod tables;
18use tables::*;
19mod tools;
20use tools::*;
21
22const MAX_WINDOWS: usize = 8;
23const MAX_SFBS: usize = 64;
24
25#[derive(Clone,Copy)]
26pub struct ICSInfo {
27 window_sequence: u8,
28 prev_window_sequence: u8,
29 window_shape: bool,
30 prev_window_shape: bool,
31 scale_factor_grouping: [bool; MAX_WINDOWS],
32 group_start: [usize; MAX_WINDOWS],
33 window_groups: usize,
34 num_windows: usize,
35 max_sfb: usize,
36 predictor_data: Option<LTPData>,
37 long_win: bool,
38}
39
40const ONLY_LONG_SEQUENCE: u8 = 0;
41const LONG_START_SEQUENCE: u8 = 1;
42const EIGHT_SHORT_SEQUENCE: u8 = 2;
43const LONG_STOP_SEQUENCE: u8 = 3;
44
45impl ICSInfo {
46 fn new() -> Self {
47 Self {
48 window_sequence: 0,
49 prev_window_sequence: 0,
50 window_shape: false,
51 prev_window_shape: false,
52 scale_factor_grouping: [false; MAX_WINDOWS],
53 group_start: [0; MAX_WINDOWS],
54 num_windows: 0,
55 window_groups: 0,
56 max_sfb: 0,
57 predictor_data: None,
58 long_win: true,
59 }
60 }
61 fn decode_ics_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
62 self.prev_window_sequence = self.window_sequence;
63 self.prev_window_shape = self.window_shape;
64 let ics_reserved_bit = br.read(1)?;
65 validate!(ics_reserved_bit == 0);
66 self.window_sequence = br.read(2)? as u8;
38df3d11 67 /*match self.prev_window_sequence {
999c25f7
KS
68 ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => {
69 if (self.window_sequence != ONLY_LONG_SEQUENCE) &&
70 (self.window_sequence != LONG_START_SEQUENCE) {
71 println!("incorrect previous window");
72 }
73 },
74 LONG_START_SEQUENCE | EIGHT_SHORT_SEQUENCE => {
75 if (self.window_sequence != EIGHT_SHORT_SEQUENCE) &&
76 (self.window_sequence != LONG_STOP_SEQUENCE) {
77 println!("incorrect previous window");
78 }
79 },
80 _ => {},
38df3d11 81 };*/
999c25f7
KS
82 self.window_shape = br.read_bool()?;
83 self.window_groups = 1;
84 if self.window_sequence == EIGHT_SHORT_SEQUENCE {
85 self.long_win = false;
86 self.num_windows = 8;
87 self.max_sfb = br.read(4)? as usize;
88 for i in 0..MAX_WINDOWS-1 {
89 self.scale_factor_grouping[i] = br.read_bool()?;
90 if !self.scale_factor_grouping[i] {
91 self.group_start[self.window_groups] = i + 1;
92 self.window_groups += 1;
93 }
94 }
95 } else {
96 self.long_win = true;
97 self.num_windows = 1;
98 self.max_sfb = br.read(6)? as usize;
99 self.predictor_data = LTPData::read(br)?;
100 }
101 Ok(())
102 }
103 fn get_group_start(&self, g: usize) -> usize {
104 if g == 0 {
105 0
106 } else if g >= self.window_groups {
107 if self.long_win { 1 } else { 8 }
108 } else {
109 self.group_start[g]
110 }
111 }
112}
113
114#[derive(Clone)]
115struct ICS {
116 global_gain: u8,
117 info: ICSInfo,
118 pulse_data: Option<PulseData>,
119 tns_data: Option<TNSData>,
120 gain_control: Option<GainControlData>,
121 sect_cb: [[u8; MAX_SFBS]; MAX_WINDOWS],
122 sect_len: [[usize; MAX_SFBS]; MAX_WINDOWS],
123 sfb_cb: [[u8; MAX_SFBS]; MAX_WINDOWS],
124 num_sec: [usize; MAX_WINDOWS],
125 scales: [[u8; MAX_SFBS]; MAX_WINDOWS],
126 sbinfo: GASubbandInfo,
127 coeffs: [f32; 1024],
128 delay: [f32; 1024],
129}
130
131const INTENSITY_SCALE_MIN: i16 = -155;
132impl ICS {
133 fn new(sbinfo: GASubbandInfo) -> Self {
134 Self {
135 global_gain: 0,
136 info: ICSInfo::new(),
137 pulse_data: None,
138 tns_data: None,
139 gain_control: None,
140 sect_cb: [[0; MAX_SFBS]; MAX_WINDOWS],
141 sect_len: [[0; MAX_SFBS]; MAX_WINDOWS],
142 sfb_cb: [[0; MAX_SFBS]; MAX_WINDOWS],
143 scales: [[0; MAX_SFBS]; MAX_WINDOWS],
144 num_sec: [0; MAX_WINDOWS],
145 sbinfo,
146 coeffs: [0.0; 1024],
147 delay: [0.0; 1024],
148 }
149 }
150 fn decode_section_data(&mut self, br: &mut BitReader, may_have_intensity: bool) -> DecoderResult<()> {
151 let sect_bits = if self.info.long_win { 5 } else { 3 };
152 let sect_esc_val = (1 << sect_bits) - 1;
153
154 for g in 0..self.info.window_groups {
155 let mut k = 0;
156 let mut l = 0;
157 while k < self.info.max_sfb {
158 self.sect_cb[g][l] = br.read(4)? as u8;
159 self.sect_len[g][l] = 0;
160 validate!(self.sect_cb[g][l] != RESERVED_HCB);
161 if ((self.sect_cb[g][l] == INTENSITY_HCB) || (self.sect_cb[g][l] == INTENSITY_HCB2)) && !may_have_intensity {
162 return Err(DecoderError::InvalidData);
163 }
164 loop {
165 let sect_len_incr = br.read(sect_bits)? as usize;
166 self.sect_len[g][l] += sect_len_incr;
167 if sect_len_incr < sect_esc_val { break; }
168 }
169 validate!(k + self.sect_len[g][l] <= self.info.max_sfb);
170 for _ in 0..self.sect_len[g][l] {
171 self.sfb_cb[g][k] = self.sect_cb[g][l];
172 k += 1;
173 }
174 l += 1;
175 }
176 self.num_sec[g] = l;
177 }
178 Ok(())
179 }
180 fn is_intensity(&self, g: usize, sfb: usize) -> bool {
181 (self.sfb_cb[g][sfb] == INTENSITY_HCB) || (self.sfb_cb[g][sfb] == INTENSITY_HCB2)
182 }
183 fn get_intensity_dir(&self, g: usize, sfb: usize) -> bool {
184 self.sfb_cb[g][sfb] == INTENSITY_HCB
185 }
0399d1ff
KS
186 fn is_noise(&self, g: usize, sfb: usize) -> bool {
187 self.sfb_cb[g][sfb] == NOISE_HCB
188 }
999c25f7
KS
189 fn decode_scale_factor_data(&mut self, br: &mut BitReader, codebooks: &Codebooks) -> DecoderResult<()> {
190 decode_scale_factor_data(br, &mut self.scales, self.global_gain, &self.info, &self.sfb_cb, codebooks)
191 }
192 fn get_band_start(&self, swb: usize) -> usize {
193 if self.info.long_win {
194 self.sbinfo.long_bands[swb]
195 } else {
196 self.sbinfo.short_bands[swb]
197 }
198 }
199 fn get_num_bands(&self) -> usize {
200 if self.info.long_win {
201 self.sbinfo.long_bands.len() - 1
202 } else {
203 self.sbinfo.short_bands.len() - 1
204 }
205 }
206 fn decode_spectrum(&mut self, br: &mut BitReader, codebooks: &Codebooks) -> DecoderResult<()> {
207 self.coeffs = [0.0; 1024];
208 decode_spectrum(br, &mut self.coeffs, &self.scales, &self.info, &self.sbinfo, &self.sfb_cb, codebooks)
209 }
27608aa6
KS
210 fn iquant(val: f32) -> f32 {
211 if val < 0.0 {
212 -((-val).powf(4.0 / 3.0))
213 } else {
214 val.powf(4.0 / 3.0)
215 }
216 }
999c25f7
KS
217 fn place_pulses(&mut self) {
218 if let Some(ref pdata) = self.pulse_data {
219 if pdata.pulse_start_sfb >= self.sbinfo.long_bands.len() - 1 { return; }
220 let mut k = self.get_band_start(pdata.pulse_start_sfb);
221 let mut band = pdata.pulse_start_sfb;
222 for pno in 0..pdata.number_pulse {
223 k += pdata.pulse_offset[pno] as usize;
224 if k >= 1024 { return; }
225 while self.get_band_start(band + 1) <= k { band += 1; }
226 let scale = get_scale(self.scales[0][band]);
227 let mut base = self.coeffs[k];
228 if base != 0.0 {
229 base = requant(self.coeffs[k], scale);
230 }
231 if base > 0.0 {
232 base += f32::from(pdata.pulse_amp[pno]);
233 } else {
234 base -= f32::from(pdata.pulse_amp[pno]);
235 }
27608aa6 236 self.coeffs[k] = Self::iquant(base) * scale;
999c25f7
KS
237 }
238 }
239 }
240 fn decode_ics(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType, common_window: bool, may_have_intensity: bool) -> DecoderResult<()> {
241 self.global_gain = br.read(8)? as u8;
242 if !common_window {
243 self.info.decode_ics_info(br)?;
244 }
245 self.decode_section_data(br, may_have_intensity)?;
246 self.decode_scale_factor_data(br, codebooks)?;
247 self.pulse_data = PulseData::read(br)?;
248 validate!(self.pulse_data.is_none() || self.info.long_win);
249 let tns_max_order;
250 if !self.info.long_win {
251 tns_max_order = 7;
252 } else if m4atype == M4AType::LC {
253 tns_max_order = 12;
254 } else {
255 tns_max_order = TNS_MAX_ORDER;
256 }
257 self.tns_data = TNSData::read(br, self.info.long_win, self.info.num_windows, tns_max_order)?;
258 if m4atype == M4AType::SSR {
259 self.gain_control = GainControlData::read(br)?;
260 } else {
261 let gain_control_data_present = br.read_bool()?;
262 validate!(!gain_control_data_present);
263 }
264 self.decode_spectrum(br, codebooks)?;
265 Ok(())
266 }
267 fn synth_channel(&mut self, dsp: &mut DSP, dst: &mut [f32], srate_idx: usize) {
268 self.place_pulses();
269 if let Some(ref tns_data) = self.tns_data {
270 let tns_max_bands = TNSData::get_max_bands(self.info.long_win, srate_idx).min(self.info.max_sfb);
271 for w in 0..self.info.num_windows {
272 let mut bottom = self.get_num_bands();
273 for f in 0..tns_data.n_filt[w] {
274 let top = bottom;
275 bottom = if top >= tns_data.coeffs[w][f].length { top - tns_data.coeffs[w][f].length } else { 0 };
276 let order = tns_data.coeffs[w][f].order;
277 if order == 0 { continue; }
278 let start = w * 128 + self.get_band_start(tns_max_bands.min(bottom));
279 let end = w * 128 + self.get_band_start(tns_max_bands.min(top));
280 tns_data.apply(&mut self.coeffs, w, f, start, end);
281 }
282 }
283 }
284 dsp.synth(&self.coeffs, &mut self.delay, self.info.window_sequence, self.info.window_shape, self.info.prev_window_shape, dst);
285 }
286}
287
288#[derive(Clone)]
289struct ChannelPair {
290 pair: bool,
291 channel: usize,
292 common_window: bool,
293 ms_mask_present: u8,
294 ms_used: [[bool; MAX_SFBS]; MAX_WINDOWS],
295 ics: [ICS; 2],
0e18270d
KS
296 sbr_hdr: SBRHeader,
297 sbr_state: SBRState,
298 sbr_ch: [SBRChannel; 2],
299 do_sbr: bool,
999c25f7
KS
300}
301
302impl ChannelPair {
303 fn new(pair: bool, channel: usize, sbinfo: GASubbandInfo) -> Self {
304 Self {
305 pair, channel,
306 common_window: false,
307 ms_mask_present: 0,
308 ms_used: [[false; MAX_SFBS]; MAX_WINDOWS],
309 ics: [ICS::new(sbinfo), ICS::new(sbinfo)],
0e18270d
KS
310 sbr_hdr: SBRHeader::new(),
311 sbr_state: SBRState::new(),
312 sbr_ch: [SBRChannel::new(), SBRChannel::new()],
313 do_sbr: false,
999c25f7
KS
314 }
315 }
316 fn decode_ga_sce(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType) -> DecoderResult<()> {
317 self.ics[0].decode_ics(br, codebooks, m4atype, false, false)?;
318 Ok(())
319 }
320 fn decode_ga_cpe(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType) -> DecoderResult<()> {
321 let common_window = br.read_bool()?;
322 self.common_window = common_window;
323 if common_window {
324 self.ics[0].info.decode_ics_info(br)?;
325 self.ms_mask_present = br.read(2)? as u8;
326 validate!(self.ms_mask_present != 3);
327 if self.ms_mask_present == 1 {
328 for g in 0..self.ics[0].info.window_groups {
329 for sfb in 0..self.ics[0].info.max_sfb {
330 self.ms_used[g][sfb] = br.read_bool()?;
331 }
332 }
e67f7901
KS
333 } else {
334 self.ms_used = [[false; MAX_SFBS]; MAX_WINDOWS];
999c25f7
KS
335 }
336 self.ics[1].info = self.ics[0].info;
337 }
338 self.ics[0].decode_ics(br, codebooks, m4atype, common_window, true)?;
339 self.ics[1].decode_ics(br, codebooks, m4atype, common_window, true)?;
962b9cb3 340 if common_window {
999c25f7
KS
341 let mut g = 0;
342 for w in 0..self.ics[0].info.num_windows {
343 if w > 0 && !self.ics[0].info.scale_factor_grouping[w - 1] {
344 g += 1;
345 }
346 for sfb in 0..self.ics[0].info.max_sfb {
347 let start = w * 128 + self.ics[0].get_band_start(sfb);
348 let end = w * 128 + self.ics[0].get_band_start(sfb + 1);
0399d1ff 349 if self.ics[1].is_intensity(g, sfb) {
999c25f7 350 let invert = (self.ms_mask_present == 1) && self.ms_used[g][sfb];
0399d1ff
KS
351 let dir = self.ics[1].get_intensity_dir(g, sfb) ^ invert;
352 let scale = 0.5f32.powf(0.25 * (f32::from(self.ics[1].scales[g][sfb]) + f32::from(INTENSITY_SCALE_MIN)));
4f84ed36 353 if dir {
999c25f7
KS
354 for i in start..end {
355 self.ics[1].coeffs[i] = scale * self.ics[0].coeffs[i];
356 }
357 } else {
358 for i in start..end {
359 self.ics[1].coeffs[i] = -scale * self.ics[0].coeffs[i];
360 }
361 }
0399d1ff 362 } else if ((self.ms_mask_present == 2) || self.ms_used[g][sfb]) && !self.ics[0].is_noise(g, sfb) {
999c25f7
KS
363 for i in start..end {
364 let tmp = self.ics[0].coeffs[i] - self.ics[1].coeffs[i];
365 self.ics[0].coeffs[i] += self.ics[1].coeffs[i];
366 self.ics[1].coeffs[i] = tmp;
367 }
368 }
369 }
370 }
371 }
372 Ok(())
373 }
0e18270d
KS
374 fn decode_sbr(&mut self, buf: &[u8], has_crc: bool, cbs: &SBRCodebooks, srate: u32) -> DecoderResult<()> {
375 let mut br = BitReader::new(buf, BitReaderMode::BE);
376 if has_crc {
377 let _bs_sbr_crc_bits = br.read(10)?;
378 }
379 if br.read_bool()? {
380 if let Ok(hdr) = SBRHeader::read(&mut br) {
381 if self.sbr_hdr.differs_from(&hdr) {
382 self.do_sbr = self.sbr_state.init(&hdr, srate).is_ok();
383 self.sbr_ch[0].reset();
384 self.sbr_ch[1].reset();
385 }
386 self.sbr_hdr = hdr;
387 } else {
388 self.do_sbr = false;
389 }
390 }
391 if self.do_sbr {
392 if !self.pair {
393 sbr_read_sce(&mut br, self.sbr_hdr.amp_res, &self.sbr_state, cbs, &mut self.sbr_ch[0])?;
394 } else {
395 sbr_read_cpe(&mut br, self.sbr_hdr.amp_res, &self.sbr_state, cbs, &mut self.sbr_ch)?;
396 }
397 }
398
399 Ok(())
400 }
401 fn synth_audio(&mut self, dsp: &mut DSP, abuf: &mut NABufferType, srate_idx: usize, upsample: bool) {
999c25f7
KS
402 let mut adata = abuf.get_abuf_f32().unwrap();
403 let output = adata.get_data_mut().unwrap();
404 let off0 = abuf.get_offset(self.channel);
405 let off1 = abuf.get_offset(self.channel + 1);
0e18270d
KS
406 if !upsample {
407 self.ics[0].synth_channel(dsp, &mut output[off0..], srate_idx);
408 if self.pair {
409 self.ics[1].synth_channel(dsp, &mut output[off1..], srate_idx);
410 }
411 } else {
412 let mut tmp = [0.0; 1024];
413 let nchannels = if self.pair { 2 } else { 1 };
414 for ch in 0..nchannels {
415 let off = if ch == 0 { off0 } else { off1 };
416 self.ics[ch].synth_channel(dsp, &mut tmp, srate_idx);
417 self.sbr_ch[ch].analysis(&mut dsp.sbr_dsp, &tmp);
418 if self.do_sbr {
419 self.sbr_ch[ch].hf_generate(&self.sbr_state);
420 self.sbr_ch[ch].hf_adjust(&self.sbr_state, &self.sbr_hdr);
421 } else {
422 self.sbr_ch[ch].bypass();
423 }
424 self.sbr_ch[ch].synthesis(&mut dsp.sbr_dsp, &mut output[off..][..2048]);
425 self.sbr_ch[ch].update_frame();
426 }
999c25f7
KS
427 }
428 }
429}
430
431struct DSP {
432 kbd_long_win: [f32; 1024],
433 kbd_short_win: [f32; 128],
434 sine_long_win: [f32; 1024],
435 sine_short_win: [f32; 128],
436 imdct_long: IMDCT,
437 imdct_short: IMDCT,
438 tmp: [f32; 2048],
439 ew_buf: [f32; 1152],
0e18270d 440 sbr_dsp: SBRDSP,
999c25f7
KS
441}
442
443const SHORT_WIN_POINT0: usize = 512 - 64;
444const SHORT_WIN_POINT1: usize = 512 + 64;
445
446impl DSP {
447 fn new() -> Self {
448 let mut kbd_long_win: [f32; 1024] = [0.0; 1024];
449 let mut kbd_short_win: [f32; 128] = [0.0; 128];
450 generate_window(WindowType::KaiserBessel(4.0), 1.0, 1024, true, &mut kbd_long_win);
451 generate_window(WindowType::KaiserBessel(6.0), 1.0, 128, true, &mut kbd_short_win);
452 let mut sine_long_win: [f32; 1024] = [0.0; 1024];
453 let mut sine_short_win: [f32; 128] = [0.0; 128];
454 generate_window(WindowType::Sine, 1.0, 1024, true, &mut sine_long_win);
455 generate_window(WindowType::Sine, 1.0, 128, true, &mut sine_short_win);
456 Self {
457 kbd_long_win, kbd_short_win,
458 sine_long_win, sine_short_win,
459 imdct_long: IMDCT::new(1024 * 2, true),
460 imdct_short: IMDCT::new(128 * 2, true),
461 tmp: [0.0; 2048], ew_buf: [0.0; 1152],
0e18270d 462 sbr_dsp: SBRDSP::new(),
999c25f7
KS
463 }
464 }
465 #[allow(clippy::cognitive_complexity)]
466 fn synth(&mut self, coeffs: &[f32; 1024], delay: &mut [f32; 1024], seq: u8, window_shape: bool, prev_window_shape: bool, dst: &mut [f32]) {
467 let long_win = if window_shape { &self.kbd_long_win } else { &self.sine_long_win };
468 let short_win = if window_shape { &self.kbd_short_win } else { &self.sine_short_win };
469 let left_long_win = if prev_window_shape { &self.kbd_long_win } else { &self.sine_long_win };
470 let left_short_win = if prev_window_shape { &self.kbd_short_win } else { &self.sine_short_win };
471 if seq != EIGHT_SHORT_SEQUENCE {
472 self.imdct_long.imdct(coeffs, &mut self.tmp);
473 } else {
474 for (ain, aout) in coeffs.chunks(128).zip(self.tmp.chunks_mut(256)) {
475 self.imdct_short.imdct(ain, aout);
476 }
477 self.ew_buf = [0.0; 1152];
478 for (w, src) in self.tmp.chunks(256).enumerate() {
479 if w > 0 {
480 for i in 0..128 {
481 self.ew_buf[w * 128 + i] += src[i] * short_win[i];
482 }
483 } else { // to be left-windowed
484 for i in 0..128 {
485 self.ew_buf[i] = src[i];
486 }
487 }
488 for i in 0..128 {
489 self.ew_buf[w * 128 + i + 128] += src[i + 128] * short_win[127 - i];
490 }
491 }
492 }
493 if seq == ONLY_LONG_SEQUENCE { // should be the most common case
494 for i in 0..1024 {
495 dst[i] = delay[i] + self.tmp[i] * left_long_win[i];
496 delay[i] = self.tmp[i + 1024] * long_win[1023 - i];
497 }
498 return;
499 }
500 // output new data
501 match seq {
502 ONLY_LONG_SEQUENCE | LONG_START_SEQUENCE => {
503 for i in 0..1024 {
504 dst[i] = self.tmp[i] * left_long_win[i] + delay[i];
505 }
506 },
507 EIGHT_SHORT_SEQUENCE => {
508 for i in 0..SHORT_WIN_POINT0 {
509 dst[i] = delay[i];
510 }
511 for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 {
512 let j = i - SHORT_WIN_POINT0;
513 dst[i] = delay[i] + self.ew_buf[j] * left_short_win[j];
514 }
515 for i in SHORT_WIN_POINT1..1024 {
516 let j = i - SHORT_WIN_POINT0;
517 dst[i] = self.ew_buf[j];
518 }
519 },
520 LONG_STOP_SEQUENCE => {
521 for i in 0..SHORT_WIN_POINT0 {
522 dst[i] = delay[i];
523 }
524 for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 {
525 dst[i] = delay[i] + self.tmp[i] * left_short_win[i - SHORT_WIN_POINT0];
526 }
527 for i in SHORT_WIN_POINT1..1024 {
528 dst[i] = self.tmp[i];
529 }
530 },
531 _ => unreachable!(""),
532 };
533 // save delay
534 match seq {
535 ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => {
536 for i in 0..1024 {
537 delay[i] = self.tmp[i + 1024] * long_win[1023 - i];
538 }
539 },
540 EIGHT_SHORT_SEQUENCE => {
541 for i in 0..SHORT_WIN_POINT1 { // last part is already windowed
542 delay[i] = self.ew_buf[i + 512+64];
543 }
544 for i in SHORT_WIN_POINT1..1024 {
545 delay[i] = 0.0;
546 }
547 },
548 LONG_START_SEQUENCE => {
549 for i in 0..SHORT_WIN_POINT0 {
550 delay[i] = self.tmp[i + 1024];
551 }
552 for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 {
553 delay[i] = self.tmp[i + 1024] * short_win[127 - (i - SHORT_WIN_POINT0)];
554 }
555 for i in SHORT_WIN_POINT1..1024 {
556 delay[i] = 0.0;
557 }
558 },
559 _ => unreachable!(""),
560 };
561 }
562}
563
564struct AACDecoder {
565 info: NACodecInfoRef,
566 chmap: NAChannelMap,
567 m4ainfo: M4AInfo,
568 pairs: Vec<ChannelPair>,
569 codebooks: Codebooks,
570 dsp: DSP,
571 sbinfo: GASubbandInfo,
0e18270d
KS
572 sbr_cbs: SBRCodebooks,
573 upsample: bool,
999c25f7
KS
574}
575
576impl AACDecoder {
577 fn new() -> Self {
578 AACDecoder {
579 info: NACodecInfo::new_dummy(),
580 chmap: NAChannelMap::new(),
581 m4ainfo: M4AInfo::new(),
582 pairs: Vec::new(),
583 codebooks: Codebooks::new(),
584 dsp: DSP::new(),
585 sbinfo: AAC_SUBBAND_INFO[0],
0e18270d
KS
586 sbr_cbs: SBRCodebooks::new(),
587 upsample: false,
999c25f7
KS
588 }
589 }
590 fn set_pair(&mut self, pair_no: usize, channel: usize, pair: bool) -> DecoderResult<()> {
591 if self.pairs.len() <= pair_no {
592 self.pairs.push(ChannelPair::new(pair, channel, self.sbinfo));
593 } else {
594 validate!(self.pairs[pair_no].channel == channel);
595 validate!(self.pairs[pair_no].pair == pair);
596 }
597 validate!(if pair { channel + 1 } else { channel } < self.m4ainfo.channels);
598 Ok(())
599 }
600 fn decode_ga(&mut self, br: &mut BitReader, abuf: &mut NABufferType) -> DecoderResult<()> {
601 let mut cur_pair = 0;
602 let mut cur_ch = 0;
603 while br.left() > 3 {
604 let id = br.read(3)?;
605 match id {
606 0 => { // ID_SCE
607 let _tag = br.read(4)?;
608 self.set_pair(cur_pair, cur_ch, false)?;
609 self.pairs[cur_pair].decode_ga_sce(br, &self.codebooks, self.m4ainfo.otype)?;
610 cur_pair += 1;
611 cur_ch += 1;
612 },
613 1 => { // ID_CPE
614 let _tag = br.read(4)?;
615 self.set_pair(cur_pair, cur_ch, true)?;
616 self.pairs[cur_pair].decode_ga_cpe(br, &self.codebooks, self.m4ainfo.otype)?;
617 cur_pair += 1;
618 cur_ch += 2;
619 },
620 2 => { // ID_CCE
621 unimplemented!("coupling channel element");
622 },
623 3 => { // ID_LFE
624 let _tag = br.read(4)?;
625 self.set_pair(cur_pair, cur_ch, false)?;
626 self.pairs[cur_pair].decode_ga_sce(br, &self.codebooks, self.m4ainfo.otype)?;
627 cur_pair += 1;
628 cur_ch += 1;
629 },
630 4 => { // ID_DSE
631 let _id = br.read(4)?;
632 let align = br.read_bool()?;
e6aaad5c
KS
633 let mut count = br.read(8)?;
634 if count == 255 { count += br.read(8)?; }
999c25f7
KS
635 if align { br.align(); }
636 br.skip(count * 8)?; // no SBR payload or such
637 },
638 5 => { // ID_PCE
9c3cd867 639 skimp_through_program_config_element(br)?;
999c25f7
KS
640 },
641 6 => { // ID_FIL
642 let mut count = br.read(4)? as usize;
643 if count == 15 {
644 count += br.read(8)? as usize;
645 count -= 1;
646 }
0e18270d
KS
647 if count > 0 {
648 let extension_type = br.read(4)?;
649 match extension_type {
650 0xD | 0xE => { // SBR data without or with CRC
651 let has_crc = extension_type == 0xE;
652
653 let mut buf = [0; 256 + 16];
654 for el in buf[..count - 1].iter_mut() {
655 *el = br.read(8)? as u8;
656 }
657 buf[count - 1] = br.read(4)? as u8;
658 if cur_pair > 0 {
659 self.pairs[cur_pair - 1].decode_sbr(&buf[..count], has_crc, &self.sbr_cbs, self.m4ainfo.srate * 2)?;
660 }
661 },
662 _ => {
663 for _ in 0..count-1 {
999c25f7 664 br.skip(8)?;
0e18270d
KS
665 }
666 br.skip(4)?;
667 },
668 };
999c25f7
KS
669 }
670 },
671 7 => { // ID_TERM
672 break;
673 },
674 _ => { unreachable!(); },
675 };
676 }
677 let srate_idx = GASubbandInfo::find_idx(self.m4ainfo.srate);
678 for pair in 0..cur_pair {
0e18270d 679 self.pairs[pair].synth_audio(&mut self.dsp, abuf, srate_idx, self.upsample);
999c25f7
KS
680 }
681 Ok(())
682 }
683}
684
685impl NADecoder for AACDecoder {
686 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
687 if let NACodecTypeInfo::Audio(_) = info.get_properties() {
688 let edata = info.get_extradata().unwrap();
689 validate!(edata.len() >= 2);
690
999c25f7
KS
691 if (edata.len() > 12) && (&edata[4..8] == b"esds") {
692 let mut mr = MemoryReader::new_read(edata.as_slice());
693 let mut br = ByteReader::new(&mut mr);
694 let esds_size = br.read_u32be()? as usize;
695 validate!(esds_size <= edata.len());
696 br.read_skip(8)?;
697 let mut info_start = 0;
698 let mut info_size = 0;
699 while br.tell() < (esds_size as u64) {
700 let tag = br.read_byte()?;
701 let mut size = 0;
702 loop {
703 let b = br.read_byte()?;
704 size = (size << 7) | u64::from(b & 0x7F);
705 validate!(br.tell() + size <= (esds_size as u64));
706 if (b & 0x80) == 0 {
707 break;
708 }
709 }
710 match tag {
711 3 => {
712 br.read_u16be()?;
713 let flags = br.read_byte()?;
714 if (flags & 0x80) != 0 {
715 br.read_u16be()?;
716 }
717 if (flags & 0x40) != 0 {
718 let len = br.read_byte()?;
719 br.read_skip(len as usize)?;
720 }
721 if (flags & 0x20) != 0 {
722 br.read_u16be()?;
723 }
724 },
725 4 => {
726 let _otype = br.read_byte()?;
727 let _stype = br.read_byte()?;
728 let _flags = br.read_u24be()?;
729 let _max_br = br.read_u32be()?;
730 let _min_br = br.read_u32be()?;
731 },
732 5 => {
733 info_start = br.tell() as usize;
734 info_size = size as usize;
735 break;
736 },
737 _ => br.read_skip(size as usize)?,
738 }
739 }
740 validate!(info_start > 0 && info_size > 0);
741 self.m4ainfo.read(&edata[info_start..][..info_size])?;
742 } else {
743 self.m4ainfo.read(&edata)?;
744 }
745
746 //println!("{}", self.m4ainfo);
747 if (self.m4ainfo.otype != M4AType::LC) || (self.m4ainfo.channels > 2) || (self.m4ainfo.samples != 1024) {
748 return Err(DecoderError::NotImplemented);
749 }
750 self.sbinfo = GASubbandInfo::find(self.m4ainfo.srate);
751
0e18270d
KS
752 self.upsample = self.m4ainfo.srate < 32000;
753 let (srate, samples) = if !self.upsample {
754 (self.m4ainfo.srate, self.m4ainfo.samples)
755 } else {
756 (self.m4ainfo.srate * 2, self.m4ainfo.samples * 2)
757 };
758
759 let ainfo = NAAudioInfo::new(srate, self.m4ainfo.channels as u8,
760 SND_F32P_FORMAT, samples);
999c25f7
KS
761 self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo));
762
763 if self.m4ainfo.channels >= DEFAULT_CHANNEL_MAP.len() {
764 return Err(DecoderError::NotImplemented);
765 }
766 let chmap_str = DEFAULT_CHANNEL_MAP[self.m4ainfo.channels];
767 if chmap_str.is_empty() { return Err(DecoderError::NotImplemented); }
768 self.chmap = NAChannelMap::from_str(chmap_str).unwrap();
769
770 Ok(())
771 } else {
772 Err(DecoderError::InvalidData)
773 }
774 }
775 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
776 let info = pkt.get_stream().get_info();
777 validate!(info.get_properties().is_audio());
778 let pktbuf = pkt.get_buffer();
779
780 let ainfo = self.info.get_properties().get_audio_info().unwrap();
0e18270d
KS
781 let samples = if !self.upsample { self.m4ainfo.samples } else { self.m4ainfo.samples * 2 };
782 let mut abuf = alloc_audio_buffer(ainfo, samples, self.chmap.clone())?;
999c25f7
KS
783
784 let mut br = BitReader::new(&pktbuf, BitReaderMode::BE);
785 match self.m4ainfo.otype {
786 M4AType::LC => {
787 self.decode_ga(&mut br, &mut abuf)?;
788 },
789 _ => { unimplemented!(""); }
790 }
791
792 let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
793 frm.set_keyframe(true);
794 Ok(frm.into_ref())
795 }
796 fn flush(&mut self) {
797 for pair in self.pairs.iter_mut() {
798 pair.ics[0].delay = [0.0; 1024];
799 pair.ics[1].delay = [0.0; 1024];
800 }
801 }
802}
803
804impl NAOptionHandler for AACDecoder {
805 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
806 fn set_options(&mut self, _options: &[NAOption]) { }
807 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
808}
809
810pub fn get_decoder() -> Box<dyn NADecoder + Send> {
811 Box::new(AACDecoder::new())
812}
813
814#[cfg(test)]
815mod test {
816 use nihav_core::codecs::RegisteredDecoders;
817 use nihav_core::demuxers::RegisteredDemuxers;
818 use nihav_codec_support::test::dec_video::test_decode_audio;
819 use crate::mpeg_register_all_decoders;
820 use nihav_realmedia::realmedia_register_all_demuxers;
821 #[test]
822 fn test_aac() {
823 let mut dmx_reg = RegisteredDemuxers::new();
824 realmedia_register_all_demuxers(&mut dmx_reg);
825 let mut dec_reg = RegisteredDecoders::new();
826 mpeg_register_all_decoders(&mut dec_reg);
827
828// let file = "assets/RV/rv40_weighted_mc.rmvb";
829 let file = "assets/RV/rv40_weighted_mc_2.rmvb";
830 test_decode_audio("realmedia", file, Some(12000), None/*Some("aac")*/, &dmx_reg, &dec_reg);
831 }
0e18270d
KS
832 #[test]
833 fn test_aac_sbr() {
834 let mut dmx_reg = RegisteredDemuxers::new();
835 nihav_commonfmt::generic_register_all_demuxers(&mut dmx_reg);
836 let mut dec_reg = RegisteredDecoders::new();
837 mpeg_register_all_decoders(&mut dec_reg);
838
839 let file = "assets/MPEG/SBRtestStereoAot29Sig0.mp4";
840 test_decode_audio("mov", file, Some(400), None/*Some("aacsbr")*/, &dmx_reg, &dec_reg);
841 }
999c25f7
KS
842}
843
844const DEFAULT_CHANNEL_MAP: [&str; 9] = [
845 "",
846 "C",
847 "L,R",
848 "C,L,R",
849 "C,L,R,Cs",
850 "C,L,R,Ls,Rs",
851 "C,L,R,Ls,Rs,LFE",
852 "",
853 "C,L,R,Ls,Rs,Lss,Rss,LFE",
854];