puremp3/
decoder.rs

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    // CRC is ignored for now.
48    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        // Skip CRC for now.
137        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    // Skip framesize?
152    // Skip ancillary data...?
153
154    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        // Skip private bits.
183        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        // Skip private bits.
198        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                // Block type 00 is only if window switching is off
259                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        // Mixed blocks are always marked as short.
276        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()?; // .5f * (1f + frame.ReadBits(1));
302    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    // Copy main_data_begin bytes from the previous frame(s).
317    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    // TODO(Herschel): Skip ancillary data.
361    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        // Normal window.
407        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                // TODO(Herschel): Is there a cleaner way to do this?
419                // Granule can copy from previous granule. I would like to write this fn without
420                // using array accesses.
421                } 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    // TODO(Herschel): We could avoid using this intermediate buffer.
485    // Write an iterator for reading scalefacs and/or write an iterator
486    // through scalefac_s/l for the block type.
487    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}