1use crate::error::{Error, Mp3Error};
2use crate::tables::{LFS_INTENSITY_STEREO_TABLE, LFS_TABLE, SCALE_FACTOR_SIZES};
3use crate::types::*;
4use bitstream_io::{BigEndian, BitReader};
5use byteorder::ReadBytesExt;
6use std::io::Read;
7
8pub fn read_frame_header<R: Read>(mut data: R) -> Result<FrameHeader, Error> {
9 if data.read_u8()? != 0xff {
10 return Err(Error::Mp3Error(Mp3Error::InvalidData(
11 "Frame sync not found",
12 )));
13 }
14
15 let byte = data.read_u8()?;
16 if byte & 0b1110_0000 != 0b1110_0000 {
17 return Err(Error::Mp3Error(Mp3Error::InvalidData(
18 "Frame sync not found",
19 )));
20 }
21
22 let version = match byte & 0b0001_1000 {
23 0b00_000 => MpegVersion::Mpeg2_5,
24 0b01_000 => {
25 return Err(Error::Mp3Error(Mp3Error::InvalidData(
26 "Invalid MPEG version",
27 )))
28 }
29 0b10_000 => MpegVersion::Mpeg2,
30 0b11_000 => MpegVersion::Mpeg1,
31 _ => unreachable!(),
32 };
33
34 let layer = match byte & 0b110 {
35 0b000 => return Err(Error::Mp3Error(Mp3Error::InvalidData("Invalid MPEG layer"))),
36 0b010 => MpegLayer::Layer3,
37 0b100 => MpegLayer::Layer2,
38 0b110 => MpegLayer::Layer1,
39 _ => unreachable!(),
40 };
41 if layer != MpegLayer::Layer3 {
42 return Err(Error::Mp3Error(Mp3Error::Unsupported(
43 "Only MPEG Layer III is supported",
44 )));
45 }
46
47 let crc = byte & 1 == 0;
49
50 let mut bytes = [0u8; 2];
51 data.read_exact(&mut bytes)?;
52
53 let is_version2 = version == MpegVersion::Mpeg2 || version == MpegVersion::Mpeg2_5;
54 let bitrate = match (bytes[0] & 0b1111_0000, is_version2) {
55 (0b0001_0000, false) => BitRate::Kbps32,
56 (0b0010_0000, false) => BitRate::Kbps40,
57 (0b0011_0000, false) => BitRate::Kbps48,
58 (0b0100_0000, false) => BitRate::Kbps56,
59 (0b0101_0000, false) => BitRate::Kbps64,
60 (0b0110_0000, false) => BitRate::Kbps80,
61 (0b0111_0000, false) => BitRate::Kbps96,
62 (0b1000_0000, false) => BitRate::Kbps112,
63 (0b1001_0000, false) => BitRate::Kbps128,
64 (0b1010_0000, false) => BitRate::Kbps160,
65 (0b1011_0000, false) => BitRate::Kbps192,
66 (0b1100_0000, false) => BitRate::Kbps224,
67 (0b1101_0000, false) => BitRate::Kbps256,
68 (0b1110_0000, false) => BitRate::Kbps320,
69
70 (0b0001_0000, true) => BitRate::Kbps8,
71 (0b0010_0000, true) => BitRate::Kbps16,
72 (0b0011_0000, true) => BitRate::Kbps24,
73 (0b0100_0000, true) => BitRate::Kbps32,
74 (0b0101_0000, true) => BitRate::Kbps40,
75 (0b0110_0000, true) => BitRate::Kbps48,
76 (0b0111_0000, true) => BitRate::Kbps56,
77 (0b1000_0000, true) => BitRate::Kbps64,
78 (0b1001_0000, true) => BitRate::Kbps80,
79 (0b1010_0000, true) => BitRate::Kbps96,
80 (0b1011_0000, true) => BitRate::Kbps112,
81 (0b1100_0000, true) => BitRate::Kbps128,
82 (0b1101_0000, true) => BitRate::Kbps144,
83 (0b1110_0000, true) => BitRate::Kbps160,
84
85 (0b0000_0000, _) => {
86 return Err(Error::Mp3Error(Mp3Error::Unsupported(
87 "Free bitrate is unsupported",
88 )))
89 }
90 _ => return Err(Error::Mp3Error(Mp3Error::InvalidData("Invalid bitrate"))),
91 };
92
93 let sample_rate = match (bytes[0] & 0b0000_1100, version) {
94 (0b00_00, MpegVersion::Mpeg1) => SampleRate::Hz44100,
95 (0b00_00, MpegVersion::Mpeg2) => SampleRate::Hz22050,
96 (0b00_00, MpegVersion::Mpeg2_5) => SampleRate::Hz11025,
97 (0b01_00, MpegVersion::Mpeg1) => SampleRate::Hz48000,
98 (0b01_00, MpegVersion::Mpeg2) => SampleRate::Hz24000,
99 (0b01_00, MpegVersion::Mpeg2_5) => SampleRate::Hz12000,
100 (0b10_00, MpegVersion::Mpeg1) => SampleRate::Hz32000,
101 (0b10_00, MpegVersion::Mpeg2) => SampleRate::Hz16000,
102 (0b10_00, MpegVersion::Mpeg2_5) => SampleRate::Hz8000,
103 _ => return Err(Error::Mp3Error(Mp3Error::InvalidData("Invalid bitrate"))),
104 };
105 let sample_rate_table = ((bytes[0] & 0b0000_1100) >> 2) as usize
106 + match version {
107 MpegVersion::Mpeg1 => 0,
108 MpegVersion::Mpeg2 => 3,
109 MpegVersion::Mpeg2_5 => 6,
110 };
111
112 let padding = bytes[0] & 0b10 != 0;
113
114 let channels = match bytes[1] & 0b11_000000 {
115 0b00_000000 => Channels::Stereo,
116 0b01_000000 => Channels::JointStereo {
117 mid_side_stereo: bytes[1] & 0b0010_0000 != 0,
118 intensity_stereo: bytes[1] & 0b0001_0000 != 0,
119 },
120 0b10_000000 => Channels::DualMono,
121 0b11_000000 => Channels::Mono,
122 _ => unreachable!(),
123 };
124
125 let copyright = bytes[1] & 0b1000 != 0;
126 let original = bytes[1] & 0b100 != 0;
127 let emphasis = match bytes[1] & 0b11 {
128 0b00 => Emphasis::None,
129 0b01 => Emphasis::FiftyFifteen,
130 0b10 => return Err(Error::Mp3Error(Mp3Error::InvalidData("Invalid emphasis"))),
131 0b11 => Emphasis::CcitJ17,
132 _ => unreachable!(),
133 };
134
135 if crc {
136 data.read_u8()?;
138 data.read_u8()?;
139 }
140
141 let bits_per_sample = match version {
142 MpegVersion::Mpeg1 => 144,
143 MpegVersion::Mpeg2 => 72,
144 MpegVersion::Mpeg2_5 => 72,
145 };
146 let data_size = (bits_per_sample * bitrate.bps() / sample_rate.hz()
147 + if padding { 1 } else { 0 }
148 - if crc { 2 } else { 0 }
149 - 4) as usize;
150
151 Ok(FrameHeader {
155 version,
156 layer,
157 crc,
158 bitrate,
159 sample_rate,
160 padding,
161 channels,
162 copyright,
163 original,
164 emphasis,
165
166 sample_rate_table,
167 data_size,
168 })
169}
170
171fn read_side_info<R: Read>(mut data: R, header: &FrameHeader) -> Result<SideInfo, Error> {
172 let mut info: SideInfo = Default::default();
173 let mut bytes = [0u8; 32];
174 let size = header.side_data_len();
175 data.read_exact(&mut bytes[..size])?;
176
177 let mut reader = BitReader::endian(&bytes[..], BigEndian);
178
179 if header.version == MpegVersion::Mpeg1 {
180 info.main_data_begin = reader.read(9)?;
181
182 if header.channels == Channels::Mono {
184 reader.skip(5)?;
185 } else {
186 reader.skip(3)?;
187 }
188
189 for scfsi in &mut info.scfsi[..header.channels.num_channels()] {
190 for band in scfsi.iter_mut() {
191 *band = reader.read_bit()?;
192 }
193 }
194 } else {
195 info.main_data_begin = reader.read(8)?;
196
197 if header.channels == Channels::Mono {
199 reader.skip(1)?;
200 } else {
201 reader.skip(2)?;
202 }
203 }
204
205 for granule in &mut info.granules[..header.num_granules()] {
206 *granule = read_granule_side_info(&header, &mut reader)?;
207 }
208
209 Ok(info)
210}
211
212fn read_granule_side_info<R: Read>(
213 header: &FrameHeader,
214 reader: &mut BitReader<R, BigEndian>,
215) -> Result<GranuleSideInfo, Error> {
216 let mut info: GranuleSideInfo = Default::default();
217 for channel_side_info in &mut info.channels[0..header.channels.num_channels()] {
218 *channel_side_info = read_granule_channel_side_info(header, reader)?;
219 }
220 Ok(info)
221}
222
223fn read_granule_channel_side_info<R: Read>(
224 header: &FrameHeader,
225 reader: &mut BitReader<R, BigEndian>,
226) -> Result<GranuleChannelSideInfo, Error> {
227 let mut info: GranuleChannelSideInfo = Default::default();
228
229 info.part2_3_length = reader.read(12)?;
230 info.big_values = reader.read(9)?;
231 if info.big_values > 288 {
232 return Err(Error::Mp3Error(Mp3Error::InvalidData("big_values > 288")));
233 }
234 info.global_gain = reader.read(8)?;
235 let scalefac_compress_len = if header.version == MpegVersion::Mpeg1 {
236 4
237 } else {
238 9
239 };
240 info.scalefac_compress = reader.read(scalefac_compress_len)?;
241
242 let window_switching = reader.read_bit()?;
243 if window_switching {
244 let block_type_id = reader.read::<u8>(2)?;
245 let mixed_block = reader.read_bit()?;
246 for region in &mut info.table_select[..2] {
247 *region = reader.read(5)?;
248 }
249
250 let mut subblock_gain = [0f32; 3];
251 for gain in &mut subblock_gain {
252 *gain = reader.read::<u8>(3)?.into();
253 }
254 info.subblock_gain = subblock_gain;
255
256 info.block_type = match block_type_id {
257 0b00 => {
258 return Err(Error::Mp3Error(Mp3Error::InvalidData(
260 "Forbidden block type",
261 )));
262 }
263 0b01 => BlockType::Start,
264 0b10 => {
265 if mixed_block {
266 BlockType::Mixed
267 } else {
268 BlockType::Short
269 }
270 }
271 0b11 => BlockType::End,
272 _ => unreachable!(),
273 };
274
275 assert!(!mixed_block || info.block_type == BlockType::Short);
277
278 info.region0_count = if info.block_type == BlockType::Short {
279 8
280 } else {
281 7
282 };
283 info.region1_count = 20 - info.region0_count;
284 } else {
285 info.block_type = BlockType::Long;
286
287 for region in &mut info.table_select {
288 *region = reader.read(5)?;
289 }
290
291 info.region0_count = reader.read(4)?;
292 info.region1_count = reader.read(3)?;
293 }
294
295 info.preflag = if header.version == MpegVersion::Mpeg1 {
296 reader.read_bit()?
297 } else {
298 info.scalefac_compress >= 500
299 };
300
301 info.scalefac_scale = reader.read_bit()?; info.count1table_select = reader.read_bit()?;
303
304 Ok(info)
305}
306
307fn read_logical_frame_data<'a, R: Read>(
308 decoder: &'a mut DecoderState,
309 mut reader: R,
310 header: &FrameHeader,
311 side_info: &SideInfo,
312) -> Result<&'a [u8], Error> {
313 let side_info_size = header.side_data_len();
314 let main_data_size = header.data_size - side_info_size;
315
316 let main_data_begin = side_info.main_data_begin as usize;
318 let prev_start = decoder.frame_buffer_len - main_data_begin;
319 for i in 0..main_data_begin {
320 decoder.frame_buffer[i] = decoder.frame_buffer[prev_start + i];
321 }
322 decoder.frame_buffer_len = main_data_begin + main_data_size;
323 reader.read_exact(&mut decoder.frame_buffer[main_data_begin..decoder.frame_buffer_len])?;
324
325 Ok(&decoder.frame_buffer[0..decoder.frame_buffer_len])
326}
327
328fn read_main_data<R: Read>(
329 reader: &mut BitReader<R, BigEndian>,
330 header: &FrameHeader,
331 side_info: &SideInfo,
332) -> Result<MainData, Error> {
333 let mut data: MainData = Default::default();
334
335 for g in 0..header.num_granules() {
336 for c in 0..header.channels.num_channels() {
337 let bits_read = if header.version == MpegVersion::Mpeg1 {
338 read_scale_factors(reader, g, c, &side_info, &mut data)?
339 } else {
340 read_lfs_scale_factors(
341 reader,
342 c == 1 && header.is_intensity_stereo(),
343 &side_info.granules[g].channels[c],
344 &mut data.granules[g].channels[c],
345 )?
346 };
347
348 let huffman_len =
349 u32::from(side_info.granules[g].channels[c].part2_3_length) - bits_read;
350 data.granules[g].channels[c].count1 = crate::huffman::read_huffman(
351 reader,
352 header,
353 &side_info.granules[g].channels[c],
354 huffman_len,
355 &mut data.granules[g].channels[c].samples,
356 )?;
357 }
358 }
359
360 Ok(data)
362}
363
364fn read_scale_factors<R: Read>(
365 reader: &mut BitReader<R, BigEndian>,
366 granule: usize,
367 channel: usize,
368 side_info: &SideInfo,
369 main_data: &mut MainData,
370) -> Result<u32, Error> {
371 let mut bits_read = 0;
372
373 let block_type = side_info.granules[granule].channels[channel].block_type;
374 let scalefac_compress =
375 side_info.granules[granule].channels[channel].scalefac_compress as usize;
376 let (scale_len1, scale_len2) = SCALE_FACTOR_SIZES[scalefac_compress];
377
378 if block_type == BlockType::Short || block_type == BlockType::Mixed {
379 let channel_info = &side_info.granules[granule].channels[channel];
380 let channel_data = &mut main_data.granules[granule].channels[channel];
381 if scale_len1 > 0 {
382 if channel_info.block_type == BlockType::Mixed {
383 for sfb in &mut channel_data.scalefac_l[..8] {
384 *sfb = reader.read(scale_len1 as u32)?;
385 bits_read += scale_len1;
386 }
387 }
388
389 for sfb in &mut channel_data.scalefac_s[..6] {
390 for window in sfb.iter_mut() {
391 *window = reader.read(scale_len1 as u32)?;
392 bits_read += scale_len1;
393 }
394 }
395 }
396
397 if scale_len2 > 0 {
398 for sfb in &mut channel_data.scalefac_s[6..12] {
399 for window in sfb.iter_mut() {
400 *window = reader.read(scale_len2 as u32)?;
401 bits_read += scale_len2;
402 }
403 }
404 }
405 } else {
406 let slices = [(0usize, 6usize), (6, 11), (11, 16), (16, 21)];
408 for (i, (start, end)) in slices.iter().enumerate() {
409 let len = if i < 2 { scale_len1 } else { scale_len2 } as u32;
410 if len > 0 {
411 if granule == 0 || !side_info.scfsi[channel][i] {
412 for sfb in
413 &mut main_data.granules[granule].channels[channel].scalefac_l[*start..*end]
414 {
415 *sfb = reader.read(len)?;
416 bits_read += len;
417 }
418 } else if granule == 1 && side_info.scfsi[channel][i] {
422 let (granule0, granules) = main_data.granules.split_first_mut().unwrap();
423 granule0.channels[channel].scalefac_l[*start..*end]
424 .copy_from_slice(&granules[0].channels[channel].scalefac_l[*start..*end]);
425 }
426 }
427 }
428 }
429
430 Ok(bits_read)
431}
432
433fn read_lfs_scale_factors<R: Read>(
434 reader: &mut BitReader<R, BigEndian>,
435 intensity_stereo_channel: bool,
436 channel_info: &GranuleChannelSideInfo,
437 channel_data: &mut MainDataChannel,
438) -> Result<u32, Error> {
439 let mut bits_read = 0;
440
441 let lfs_table = if intensity_stereo_channel {
442 &LFS_INTENSITY_STEREO_TABLE
443 } else {
444 &LFS_TABLE
445 };
446 let lfs_table = match channel_info.block_type {
447 BlockType::Short => &lfs_table[1],
448 BlockType::Mixed => &lfs_table[2],
449 _ => &lfs_table[0],
450 };
451
452 let (scale_lens, lfs_table) = if intensity_stereo_channel {
453 let sfc = u32::from(channel_info.scalefac_compress / 2);
454 match sfc {
455 0...179 => ([sfc / 36, (sfc % 36) / 6, sfc % 6, 0], &lfs_table[0]),
456 180...243 => (
457 [
458 ((sfc - 180) % 64) / 16,
459 ((sfc - 180) % 16) / 4,
460 (sfc - 180) % 4,
461 0,
462 ],
463 &lfs_table[1],
464 ),
465 244...255 => ([(sfc - 244) / 3, (sfc - 244) % 3, 0, 0], &lfs_table[2]),
466 _ => unreachable!(),
467 }
468 } else {
469 let sfc = u32::from(channel_info.scalefac_compress);
470 match sfc {
471 0...399 => (
472 [sfc / 80, (sfc / 16) % 5, (sfc % 16) / 4, sfc & 3],
473 &lfs_table[0],
474 ),
475 400...499 => (
476 [(sfc - 400) / 20, ((sfc - 400) / 4) % 5, (sfc - 400) % 4, 0],
477 &lfs_table[1],
478 ),
479 500...512 => ([(sfc - 500) / 3, (sfc - 500) % 3, 0, 0], &lfs_table[2]),
480 _ => unreachable!(),
481 }
482 };
483
484 let mut scalefacs = [0u8; 54];
488 let mut i = 0;
489 for (&len, &num_blocks) in scale_lens[..].iter().zip(lfs_table.iter()) {
490 assert!(len <= 8);
491 if len > 0 {
492 for _ in 0..num_blocks {
493 scalefacs[i] = reader.read(len)?;
494 bits_read += len;
495 i += 1;
496 }
497 } else {
498 i += num_blocks;
499 }
500 }
501
502 i = 0;
503 if channel_info.block_type == BlockType::Short || channel_info.block_type == BlockType::Mixed {
504 let short_start = if channel_info.block_type == BlockType::Mixed {
505 for sfb in 0..8 {
506 channel_data.scalefac_l[sfb] = scalefacs[i];
507 i += 1;
508 }
509 3
510 } else {
511 0
512 };
513
514 for sfb in short_start..12 {
515 for window in 0..3 {
516 channel_data.scalefac_s[sfb][window] = scalefacs[i];
517 i += 1;
518 }
519 }
520 } else {
521 for sfb in 0..21 {
522 channel_data.scalefac_l[sfb] = scalefacs[i];
523 i += 1;
524 }
525 }
526
527 Ok(bits_read)
528}
529
530pub fn process_frame<R: Read>(
531 decoder: &mut DecoderState,
532 mut reader: R,
533 header: &FrameHeader,
534) -> Result<(usize, [[f32; 1152]; 2]), Error> {
535 let side_info = read_side_info(&mut reader, header)?;
536 let data_buffer = read_logical_frame_data(decoder, &mut reader, header, &side_info)?;
537
538 let mut reader = BitReader::endian(data_buffer, BigEndian);
539 let mut main_data = read_main_data(&mut reader, header, &side_info)?;
540
541 let mut out_samples = [[0f32; 1152]; 2];
542 let num_samples = decode_frame(
543 decoder,
544 header,
545 &side_info,
546 &mut main_data,
547 &mut out_samples,
548 )?;
549
550 Ok((num_samples, out_samples))
551}
552
553fn decode_frame(
554 decoder: &mut DecoderState,
555 header: &FrameHeader,
556 side_info: &SideInfo,
557 main_data: &mut MainData,
558 out_samples: &mut [[f32; 1152]; 2],
559) -> Result<usize, Error> {
560 use crate::{requantize, stereo, synthesis};
561
562 if header.channels == Channels::Mono {
563 for gr in 0..header.num_granules() {
564 let side_info = &side_info.granules[gr].channels[0];
565 let main_data = &mut main_data.granules[gr].channels[0];
566
567 requantize::requantize(header, side_info, main_data);
568 requantize::reorder(header, side_info, main_data);
569 synthesis::antialias(side_info, &mut main_data.samples);
570 synthesis::hybrid_synthesis(
571 side_info.block_type,
572 &mut decoder.store[0],
573 &mut main_data.samples,
574 );
575 synthesis::frequency_inversion(&mut main_data.samples);
576 synthesis::subband_synthesis(
577 &main_data.samples,
578 &mut decoder.sbs_v_vec[0],
579 &mut out_samples[0][gr * 576..(gr + 1) * 576],
580 );
581 }
582
583 out_samples[1] = out_samples[0];
584 } else {
585 for gr in 0..header.num_granules() {
586 for ch in 0..MAX_CHANNELS {
587 let side_info = &side_info.granules[gr].channels[ch];
588 let main_data = &mut main_data.granules[gr].channels[ch];
589
590 requantize::requantize(header, side_info, main_data);
591 requantize::reorder(header, side_info, main_data);
592 }
593
594 if let Channels::JointStereo {
595 intensity_stereo,
596 mid_side_stereo,
597 } = header.channels
598 {
599 stereo::stereo(
600 header,
601 &side_info.granules[gr],
602 intensity_stereo,
603 mid_side_stereo,
604 &mut main_data.granules[gr],
605 );
606 }
607
608 for (ch, out_channel) in out_samples.iter_mut().enumerate() {
609 let side_info = &side_info.granules[gr].channels[ch];
610 let main_data = &mut main_data.granules[gr].channels[ch];
611
612 synthesis::antialias(side_info, &mut main_data.samples);
613 synthesis::hybrid_synthesis(
614 side_info.block_type,
615 &mut decoder.store[ch],
616 &mut main_data.samples,
617 );
618 synthesis::frequency_inversion(&mut main_data.samples);
619 synthesis::subband_synthesis(
620 &main_data.samples,
621 &mut decoder.sbs_v_vec[ch],
622 &mut out_channel[gr * 576..(gr + 1) * 576],
623 );
624 }
625 }
626 }
627 Ok(header.num_granules() * 576)
628}