Serenity Operating System
1/*
2 * Copyright (c) 2021, Arne Elster <arne@elster.li>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include "MP3Loader.h"
8#include "MP3HuffmanTables.h"
9#include "MP3Tables.h"
10#include "MP3Types.h"
11#include <AK/FixedArray.h>
12#include <LibCore/File.h>
13
14namespace Audio {
15
16DSP::MDCT<12> MP3LoaderPlugin::s_mdct_12;
17DSP::MDCT<36> MP3LoaderPlugin::s_mdct_36;
18
19MP3LoaderPlugin::MP3LoaderPlugin(NonnullOwnPtr<SeekableStream> stream)
20 : LoaderPlugin(move(stream))
21{
22}
23
24Result<NonnullOwnPtr<MP3LoaderPlugin>, LoaderError> MP3LoaderPlugin::create(StringView path)
25{
26 auto stream = LOADER_TRY(Core::BufferedFile::create(LOADER_TRY(Core::File::open(path, Core::File::OpenMode::Read))));
27 auto loader = make<MP3LoaderPlugin>(move(stream));
28
29 LOADER_TRY(loader->initialize());
30
31 return loader;
32}
33
34Result<NonnullOwnPtr<MP3LoaderPlugin>, LoaderError> MP3LoaderPlugin::create(Bytes buffer)
35{
36 auto stream = LOADER_TRY(try_make<FixedMemoryStream>(buffer));
37 auto loader = make<MP3LoaderPlugin>(move(stream));
38
39 LOADER_TRY(loader->initialize());
40
41 return loader;
42}
43
44MaybeLoaderError MP3LoaderPlugin::initialize()
45{
46 m_bitstream = LOADER_TRY(try_make<BigEndianInputBitStream>(MaybeOwned<Stream>(*m_stream)));
47
48 TRY(synchronize());
49
50 auto header = TRY(read_header());
51 if (header.id != 1 || header.layer != 3)
52 return LoaderError { LoaderError::Category::Format, "Only MPEG-1 layer 3 supported." };
53
54 m_sample_rate = header.samplerate;
55 m_num_channels = header.channel_count();
56 m_loaded_samples = 0;
57
58 TRY(build_seek_table());
59
60 LOADER_TRY(m_stream->seek(0, SeekMode::SetPosition));
61
62 return {};
63}
64
65MaybeLoaderError MP3LoaderPlugin::reset()
66{
67 TRY(seek(0));
68 m_current_frame = {};
69 m_synthesis_buffer = {};
70 m_loaded_samples = 0;
71 LOADER_TRY(m_bit_reservoir.discard(m_bit_reservoir.used_buffer_size()));
72 m_bitstream->align_to_byte_boundary();
73 return {};
74}
75
76MaybeLoaderError MP3LoaderPlugin::seek(int const position)
77{
78 for (auto const& seek_entry : m_seek_table) {
79 if (seek_entry.get<1>() >= position) {
80 LOADER_TRY(m_stream->seek(seek_entry.get<0>(), SeekMode::SetPosition));
81 m_loaded_samples = seek_entry.get<1>();
82 break;
83 }
84 }
85 m_current_frame = {};
86 m_synthesis_buffer = {};
87 LOADER_TRY(m_bit_reservoir.discard(m_bit_reservoir.used_buffer_size()));
88 m_bitstream->align_to_byte_boundary();
89 return {};
90}
91
92ErrorOr<Vector<FixedArray<Sample>>, LoaderError> MP3LoaderPlugin::load_chunks(size_t samples_to_read_from_input)
93{
94 int samples_to_read = samples_to_read_from_input;
95 Vector<FixedArray<Sample>> frames;
96 while (samples_to_read > 0) {
97 FixedArray<Sample> samples = LOADER_TRY(FixedArray<Sample>::create(MP3::frame_size));
98
99 if (!m_current_frame.has_value()) {
100 auto maybe_frame = read_next_frame();
101 if (maybe_frame.is_error()) {
102 if (m_stream->is_eof()) {
103 return Vector<FixedArray<Sample>> {};
104 }
105 return maybe_frame.release_error();
106 }
107 m_current_frame = maybe_frame.release_value();
108 if (!m_current_frame.has_value())
109 break;
110 }
111
112 bool const is_stereo = m_current_frame->header.channel_count() == 2;
113 size_t current_frame_read = 0;
114 for (; current_frame_read < MP3::granule_size; current_frame_read++) {
115 auto const left_sample = m_current_frame->channels[0].granules[0].pcm[current_frame_read / 32][current_frame_read % 32];
116 auto const right_sample = is_stereo ? m_current_frame->channels[1].granules[0].pcm[current_frame_read / 32][current_frame_read % 32] : left_sample;
117 samples[current_frame_read] = Sample { left_sample, right_sample };
118 samples_to_read--;
119 }
120 for (; current_frame_read < MP3::frame_size; current_frame_read++) {
121 auto const left_sample = m_current_frame->channels[0].granules[1].pcm[(current_frame_read - MP3::granule_size) / 32][(current_frame_read - MP3::granule_size) % 32];
122 auto const right_sample = is_stereo ? m_current_frame->channels[1].granules[1].pcm[(current_frame_read - MP3::granule_size) / 32][(current_frame_read - MP3::granule_size) % 32] : left_sample;
123 samples[current_frame_read] = Sample { left_sample, right_sample };
124 samples_to_read--;
125 }
126 m_loaded_samples += samples.size();
127 TRY(frames.try_append(move(samples)));
128 m_current_frame = {};
129 }
130
131 return frames;
132}
133
134MaybeLoaderError MP3LoaderPlugin::build_seek_table()
135{
136 int sample_count = 0;
137 size_t frame_count = 0;
138 m_seek_table.clear();
139
140 m_bitstream->align_to_byte_boundary();
141
142 while (!synchronize().is_error()) {
143 auto const frame_pos = -2 + LOADER_TRY(m_stream->seek(0, SeekMode::FromCurrentPosition));
144
145 auto error_or_header = read_header();
146 if (error_or_header.is_error() || error_or_header.value().id != 1 || error_or_header.value().layer != 3) {
147 continue;
148 }
149 frame_count++;
150 sample_count += MP3::frame_size;
151
152 if (frame_count % 10 == 0)
153 m_seek_table.append({ frame_pos, sample_count });
154
155 LOADER_TRY(m_stream->seek(error_or_header.value().frame_size - 6, SeekMode::FromCurrentPosition));
156
157 // TODO: This is just here to clear the bitstream buffer.
158 // Bitstream should have a method to sync its state to the underlying stream.
159 m_bitstream->align_to_byte_boundary();
160 }
161 m_total_samples = sample_count;
162 return {};
163}
164
165ErrorOr<MP3::Header, LoaderError> MP3LoaderPlugin::read_header()
166{
167 MP3::Header header;
168 header.id = LOADER_TRY(m_bitstream->read_bit());
169 header.layer = MP3::Tables::LayerNumberLookup[LOADER_TRY(m_bitstream->read_bits(2))];
170 if (header.layer <= 0)
171 return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Frame header contains invalid layer number." };
172 header.protection_bit = LOADER_TRY(m_bitstream->read_bit());
173 header.bitrate = MP3::Tables::BitratesPerLayerLookup[header.layer - 1][LOADER_TRY(m_bitstream->read_bits(4))];
174 if (header.bitrate <= 0)
175 return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Frame header contains invalid bitrate." };
176 header.samplerate = MP3::Tables::SampleratesLookup[LOADER_TRY(m_bitstream->read_bits(2))];
177 if (header.samplerate <= 0)
178 return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Frame header contains invalid samplerate." };
179 header.padding_bit = LOADER_TRY(m_bitstream->read_bit());
180 header.private_bit = LOADER_TRY(m_bitstream->read_bit());
181 header.mode = static_cast<MP3::Mode>(LOADER_TRY(m_bitstream->read_bits(2)));
182 header.mode_extension = static_cast<MP3::ModeExtension>(LOADER_TRY(m_bitstream->read_bits(2)));
183 header.copyright_bit = LOADER_TRY(m_bitstream->read_bit());
184 header.original_bit = LOADER_TRY(m_bitstream->read_bit());
185 header.emphasis = static_cast<MP3::Emphasis>(LOADER_TRY(m_bitstream->read_bits(2)));
186 if (!header.protection_bit)
187 header.crc16 = LOADER_TRY(m_bitstream->read_bits<u16>(16));
188 header.frame_size = 144 * header.bitrate * 1000 / header.samplerate + header.padding_bit;
189 header.slot_count = header.frame_size - ((header.channel_count() == 2 ? 32 : 17) + (header.protection_bit ? 0 : 2) + 4);
190 return header;
191}
192
193MaybeLoaderError MP3LoaderPlugin::synchronize()
194{
195 size_t one_counter = 0;
196 while (one_counter < 12 && !m_bitstream->is_eof()) {
197 bool const bit = LOADER_TRY(m_bitstream->read_bit());
198 one_counter = bit ? one_counter + 1 : 0;
199 if (!bit) {
200 m_bitstream->align_to_byte_boundary();
201 }
202 }
203 if (one_counter != 12)
204 return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Failed to synchronize." };
205 return {};
206}
207
208ErrorOr<MP3::MP3Frame, LoaderError> MP3LoaderPlugin::read_next_frame()
209{
210 // Note: This will spin until we find a correct frame, or we reach eof.
211 // In the second case, the error will bubble up from read_frame_data().
212 while (true) {
213 TRY(synchronize());
214 MP3::Header header = TRY(read_header());
215 if (header.id != 1 || header.layer != 3) {
216 continue;
217 }
218
219 return read_frame_data(header);
220 }
221}
222
223ErrorOr<MP3::MP3Frame, LoaderError> MP3LoaderPlugin::read_frame_data(MP3::Header const& header)
224{
225 MP3::MP3Frame frame { header };
226
227 TRY(read_side_information(frame));
228
229 auto maybe_buffer = ByteBuffer::create_uninitialized(header.slot_count);
230 if (maybe_buffer.is_error())
231 return LoaderError { LoaderError::Category::IO, m_loaded_samples, "Out of memory" };
232 auto& buffer = maybe_buffer.value();
233
234 size_t old_reservoir_size = m_bit_reservoir.used_buffer_size();
235 LOADER_TRY(m_bitstream->read_until_filled(buffer));
236 LOADER_TRY(m_bit_reservoir.write_until_depleted(buffer));
237
238 // If we don't have enough data in the reservoir to process this frame, skip it (but keep the data).
239 if (old_reservoir_size < static_cast<size_t>(frame.main_data_begin))
240 return frame;
241
242 TRY(m_bit_reservoir.discard(old_reservoir_size - frame.main_data_begin));
243
244 BigEndianInputBitStream reservoir_stream { MaybeOwned<Stream>(m_bit_reservoir) };
245
246 for (size_t granule_index = 0; granule_index < 2; granule_index++) {
247 for (size_t channel_index = 0; channel_index < header.channel_count(); channel_index++) {
248 size_t scale_factor_size = TRY(read_scale_factors(frame, reservoir_stream, granule_index, channel_index));
249 TRY(read_huffman_data(frame, reservoir_stream, granule_index, channel_index, scale_factor_size));
250 if (frame.channels[channel_index].granules[granule_index].block_type == MP3::BlockType::Short) {
251 reorder_samples(frame.channels[channel_index].granules[granule_index], frame.header.samplerate);
252
253 // Only reduce alias for lowest 2 bands as they're long.
254 // Afaik this is not mentioned in the ISO spec, but it is addressed in the
255 // changelog for the ISO compliance tests.
256 if (frame.channels[channel_index].granules[granule_index].mixed_block_flag)
257 reduce_alias(frame.channels[channel_index].granules[granule_index], 36);
258 } else {
259 reduce_alias(frame.channels[channel_index].granules[granule_index]);
260 }
261 }
262
263 if (header.mode == MP3::Mode::JointStereo) {
264 process_stereo(frame, granule_index);
265 }
266 }
267
268 for (size_t granule_index = 0; granule_index < 2; granule_index++) {
269 for (size_t channel_index = 0; channel_index < header.channel_count(); channel_index++) {
270 auto& granule = frame.channels[channel_index].granules[granule_index];
271
272 for (size_t i = 0; i < MP3::granule_size; i += 18) {
273 MP3::BlockType block_type = granule.block_type;
274 if (i < 36 && granule.mixed_block_flag) {
275 // ISO/IEC 11172-3: if mixed_block_flag is set, the lowest two subbands are transformed with normal window.
276 block_type = MP3::BlockType::Normal;
277 }
278
279 Array<float, 36> output;
280 transform_samples_to_time(granule.samples, i, output, block_type);
281
282 int const subband_index = i / 18;
283 for (size_t sample_index = 0; sample_index < 18; sample_index++) {
284 // overlap add
285 granule.filter_bank_input[subband_index][sample_index] = output[sample_index] + m_last_values[channel_index][subband_index][sample_index];
286 m_last_values[channel_index][subband_index][sample_index] = output[sample_index + 18];
287
288 // frequency inversion
289 if (subband_index % 2 == 1 && sample_index % 2 == 1)
290 granule.filter_bank_input[subband_index][sample_index] *= -1;
291 }
292 }
293 }
294 }
295
296 Array<float, 32> in_samples;
297 for (size_t channel_index = 0; channel_index < frame.header.channel_count(); channel_index++) {
298 for (size_t granule_index = 0; granule_index < 2; granule_index++) {
299 auto& granule = frame.channels[channel_index].granules[granule_index];
300 for (size_t sample_index = 0; sample_index < 18; sample_index++) {
301 for (size_t band_index = 0; band_index < 32; band_index++) {
302 in_samples[band_index] = granule.filter_bank_input[band_index][sample_index];
303 }
304 synthesis(m_synthesis_buffer[channel_index], in_samples, granule.pcm[sample_index]);
305 }
306 }
307 }
308
309 return frame;
310}
311
312MaybeLoaderError MP3LoaderPlugin::read_side_information(MP3::MP3Frame& frame)
313{
314 frame.main_data_begin = LOADER_TRY(m_bitstream->read_bits(9));
315
316 if (frame.header.channel_count() == 1) {
317 frame.private_bits = LOADER_TRY(m_bitstream->read_bits(5));
318 } else {
319 frame.private_bits = LOADER_TRY(m_bitstream->read_bits(3));
320 }
321
322 for (size_t channel_index = 0; channel_index < frame.header.channel_count(); channel_index++) {
323 for (size_t scale_factor_selection_info_band = 0; scale_factor_selection_info_band < 4; scale_factor_selection_info_band++) {
324 frame.channels[channel_index].scale_factor_selection_info[scale_factor_selection_info_band] = LOADER_TRY(m_bitstream->read_bit());
325 }
326 }
327
328 for (size_t granule_index = 0; granule_index < 2; granule_index++) {
329 for (size_t channel_index = 0; channel_index < frame.header.channel_count(); channel_index++) {
330 auto& granule = frame.channels[channel_index].granules[granule_index];
331 granule.part_2_3_length = LOADER_TRY(m_bitstream->read_bits(12));
332 granule.big_values = LOADER_TRY(m_bitstream->read_bits(9));
333 granule.global_gain = LOADER_TRY(m_bitstream->read_bits(8));
334 granule.scalefac_compress = LOADER_TRY(m_bitstream->read_bits(4));
335 granule.window_switching_flag = LOADER_TRY(m_bitstream->read_bit());
336 if (granule.window_switching_flag) {
337 granule.block_type = static_cast<MP3::BlockType>(LOADER_TRY(m_bitstream->read_bits(2)));
338 granule.mixed_block_flag = LOADER_TRY(m_bitstream->read_bit());
339 for (size_t region = 0; region < 2; region++)
340 granule.table_select[region] = LOADER_TRY(m_bitstream->read_bits(5));
341 for (size_t window = 0; window < 3; window++)
342 granule.sub_block_gain[window] = LOADER_TRY(m_bitstream->read_bits(3));
343 granule.region0_count = (granule.block_type == MP3::BlockType::Short && !granule.mixed_block_flag) ? 8 : 7;
344 granule.region1_count = 36;
345 } else {
346 for (size_t region = 0; region < 3; region++)
347 granule.table_select[region] = LOADER_TRY(m_bitstream->read_bits(5));
348 granule.region0_count = LOADER_TRY(m_bitstream->read_bits(4));
349 granule.region1_count = LOADER_TRY(m_bitstream->read_bits(3));
350 }
351 granule.preflag = LOADER_TRY(m_bitstream->read_bit());
352 granule.scalefac_scale = LOADER_TRY(m_bitstream->read_bit());
353 granule.count1table_select = LOADER_TRY(m_bitstream->read_bit());
354 }
355 }
356 return {};
357}
358
359// From ISO/IEC 11172-3 (2.4.3.4.7.1)
360Array<float, MP3::granule_size> MP3LoaderPlugin::calculate_frame_exponents(MP3::MP3Frame const& frame, size_t granule_index, size_t channel_index)
361{
362 Array<float, MP3::granule_size> exponents;
363
364 auto fill_band = [&exponents](float exponent, size_t start, size_t end) {
365 for (size_t j = start; j <= end; j++) {
366 exponents[j] = exponent;
367 }
368 };
369
370 auto const& channel = frame.channels[channel_index];
371 auto const& granule = frame.channels[channel_index].granules[granule_index];
372
373 auto const scale_factor_bands = get_scalefactor_bands(granule, frame.header.samplerate);
374 float const scale_factor_multiplier = granule.scalefac_scale ? 1 : 0.5;
375 int const gain = granule.global_gain - 210;
376
377 if (granule.block_type != MP3::BlockType::Short) {
378 for (size_t band_index = 0; band_index < 22; band_index++) {
379 float const exponent = gain / 4.0f - (scale_factor_multiplier * (channel.scale_factors[band_index] + granule.preflag * MP3::Tables::Pretab[band_index]));
380 fill_band(AK::pow<float>(2.0, exponent), scale_factor_bands[band_index].start, scale_factor_bands[band_index].end);
381 }
382 } else {
383 size_t band_index = 0;
384 size_t sample_count = 0;
385
386 if (granule.mixed_block_flag) {
387 while (sample_count < 36) {
388 float const exponent = gain / 4.0f - (scale_factor_multiplier * (channel.scale_factors[band_index] + granule.preflag * MP3::Tables::Pretab[band_index]));
389 fill_band(AK::pow<float>(2.0, exponent), scale_factor_bands[band_index].start, scale_factor_bands[band_index].end);
390 sample_count += scale_factor_bands[band_index].width;
391 band_index++;
392 }
393 }
394
395 float const gain0 = (gain - 8 * granule.sub_block_gain[0]) / 4.0;
396 float const gain1 = (gain - 8 * granule.sub_block_gain[1]) / 4.0;
397 float const gain2 = (gain - 8 * granule.sub_block_gain[2]) / 4.0;
398
399 while (sample_count < MP3::granule_size && band_index < scale_factor_bands.size()) {
400 float const exponent0 = gain0 - (scale_factor_multiplier * channel.scale_factors[band_index + 0]);
401 float const exponent1 = gain1 - (scale_factor_multiplier * channel.scale_factors[band_index + 1]);
402 float const exponent2 = gain2 - (scale_factor_multiplier * channel.scale_factors[band_index + 2]);
403
404 fill_band(AK::pow<float>(2.0, exponent0), scale_factor_bands[band_index + 0].start, scale_factor_bands[band_index + 0].end);
405 sample_count += scale_factor_bands[band_index + 0].width;
406 fill_band(AK::pow<float>(2.0, exponent1), scale_factor_bands[band_index + 1].start, scale_factor_bands[band_index + 1].end);
407 sample_count += scale_factor_bands[band_index + 1].width;
408 fill_band(AK::pow<float>(2.0, exponent2), scale_factor_bands[band_index + 2].start, scale_factor_bands[band_index + 2].end);
409 sample_count += scale_factor_bands[band_index + 2].width;
410
411 band_index += 3;
412 }
413
414 while (sample_count < MP3::granule_size)
415 exponents[sample_count++] = 0;
416 }
417 return exponents;
418}
419
420ErrorOr<size_t, LoaderError> MP3LoaderPlugin::read_scale_factors(MP3::MP3Frame& frame, BigEndianInputBitStream& reservoir, size_t granule_index, size_t channel_index)
421{
422 auto& channel = frame.channels[channel_index];
423 auto const& granule = channel.granules[granule_index];
424 size_t band_index = 0;
425 size_t bits_read = 0;
426
427 if (granule.window_switching_flag && granule.block_type == MP3::BlockType::Short) {
428 if (granule.mixed_block_flag) {
429 for (size_t i = 0; i < 8; i++) {
430 auto const bits = MP3::Tables::ScalefacCompressSlen1[granule.scalefac_compress];
431 channel.scale_factors[band_index++] = TRY(reservoir.read_bits(bits));
432 bits_read += bits;
433 }
434 for (size_t i = 3; i < 12; i++) {
435 auto const bits = i <= 5 ? MP3::Tables::ScalefacCompressSlen1[granule.scalefac_compress] : MP3::Tables::ScalefacCompressSlen2[granule.scalefac_compress];
436 channel.scale_factors[band_index++] = TRY(reservoir.read_bits(bits));
437 channel.scale_factors[band_index++] = TRY(reservoir.read_bits(bits));
438 channel.scale_factors[band_index++] = TRY(reservoir.read_bits(bits));
439 bits_read += 3 * bits;
440 }
441 } else {
442 for (size_t i = 0; i < 12; i++) {
443 auto const bits = i <= 5 ? MP3::Tables::ScalefacCompressSlen1[granule.scalefac_compress] : MP3::Tables::ScalefacCompressSlen2[granule.scalefac_compress];
444 channel.scale_factors[band_index++] = TRY(reservoir.read_bits(bits));
445 channel.scale_factors[band_index++] = TRY(reservoir.read_bits(bits));
446 channel.scale_factors[band_index++] = TRY(reservoir.read_bits(bits));
447 bits_read += 3 * bits;
448 }
449 }
450 channel.scale_factors[band_index++] = 0;
451 channel.scale_factors[band_index++] = 0;
452 channel.scale_factors[band_index++] = 0;
453 } else {
454 if ((channel.scale_factor_selection_info[0] == 0) || (granule_index == 0)) {
455 for (band_index = 0; band_index < 6; band_index++) {
456 auto const bits = MP3::Tables::ScalefacCompressSlen1[granule.scalefac_compress];
457 channel.scale_factors[band_index] = TRY(reservoir.read_bits(bits));
458 bits_read += bits;
459 }
460 }
461 if ((channel.scale_factor_selection_info[1] == 0) || (granule_index == 0)) {
462 for (band_index = 6; band_index < 11; band_index++) {
463 auto const bits = MP3::Tables::ScalefacCompressSlen1[granule.scalefac_compress];
464 channel.scale_factors[band_index] = TRY(reservoir.read_bits(bits));
465 bits_read += bits;
466 }
467 }
468 if ((channel.scale_factor_selection_info[2] == 0) || (granule_index == 0)) {
469 for (band_index = 11; band_index < 16; band_index++) {
470 auto const bits = MP3::Tables::ScalefacCompressSlen2[granule.scalefac_compress];
471 channel.scale_factors[band_index] = TRY(reservoir.read_bits(bits));
472 bits_read += bits;
473 }
474 }
475 if ((channel.scale_factor_selection_info[3] == 0) || (granule_index == 0)) {
476 for (band_index = 16; band_index < 21; band_index++) {
477 auto const bits = MP3::Tables::ScalefacCompressSlen2[granule.scalefac_compress];
478 channel.scale_factors[band_index] = TRY(reservoir.read_bits(bits));
479 bits_read += bits;
480 }
481 }
482 channel.scale_factors[21] = 0;
483 }
484
485 return bits_read;
486}
487
488MaybeLoaderError MP3LoaderPlugin::read_huffman_data(MP3::MP3Frame& frame, BigEndianInputBitStream& reservoir, size_t granule_index, size_t channel_index, size_t granule_bits_read)
489{
490 auto const exponents = calculate_frame_exponents(frame, granule_index, channel_index);
491 auto& granule = frame.channels[channel_index].granules[granule_index];
492
493 auto const scale_factor_bands = get_scalefactor_bands(granule, frame.header.samplerate);
494 size_t const scale_factor_band_index1 = granule.region0_count + 1;
495 size_t const scale_factor_band_index2 = min(scale_factor_bands.size() - 1, scale_factor_band_index1 + granule.region1_count + 1);
496
497 bool const is_short_granule = granule.window_switching_flag && granule.block_type == MP3::BlockType::Short;
498 size_t const region1_start = is_short_granule ? 36 : scale_factor_bands[scale_factor_band_index1].start;
499 size_t const region2_start = is_short_granule ? MP3::granule_size : scale_factor_bands[scale_factor_band_index2].start;
500
501 auto requantize = [](int const sample, float const exponent) -> float {
502 int const sign = sample < 0 ? -1 : 1;
503 int const magnitude = AK::abs(sample);
504 return sign * AK::pow<float>(static_cast<float>(magnitude), 4 / 3.0) * exponent;
505 };
506
507 size_t count = 0;
508
509 for (; count < granule.big_values * 2; count += 2) {
510 MP3::Tables::Huffman::HuffmanTreeXY const* tree = nullptr;
511
512 if (count < region1_start) {
513 tree = &MP3::Tables::Huffman::HuffmanTreesXY[granule.table_select[0]];
514 } else if (count < region2_start) {
515 tree = &MP3::Tables::Huffman::HuffmanTreesXY[granule.table_select[1]];
516 } else {
517 tree = &MP3::Tables::Huffman::HuffmanTreesXY[granule.table_select[2]];
518 }
519
520 if (!tree || tree->nodes.is_empty()) {
521 return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Frame references invalid huffman table." };
522 }
523
524 // Assumption: There's enough bits to read. 32 is just a placeholder for "unlimited".
525 // There are no 32 bit long huffman codes in the tables.
526 auto const entry = MP3::Tables::Huffman::huffman_decode(reservoir, tree->nodes, 32);
527 granule_bits_read += entry.bits_read;
528 if (!entry.code.has_value())
529 return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Frame contains invalid huffman data." };
530 int x = entry.code->symbol.x;
531 int y = entry.code->symbol.y;
532
533 if (x == 15 && tree->linbits > 0) {
534 x += LOADER_TRY(reservoir.read_bits(tree->linbits));
535 granule_bits_read += tree->linbits;
536 }
537 if (x != 0) {
538 if (LOADER_TRY(reservoir.read_bit()))
539 x = -x;
540 granule_bits_read++;
541 }
542
543 if (y == 15 && tree->linbits > 0) {
544 y += LOADER_TRY(reservoir.read_bits(tree->linbits));
545 granule_bits_read += tree->linbits;
546 }
547 if (y != 0) {
548 if (LOADER_TRY(reservoir.read_bit()))
549 y = -y;
550 granule_bits_read++;
551 }
552
553 granule.samples[count + 0] = requantize(x, exponents[count + 0]);
554 granule.samples[count + 1] = requantize(y, exponents[count + 1]);
555 }
556
557 ReadonlySpan<MP3::Tables::Huffman::HuffmanNode<MP3::Tables::Huffman::HuffmanVWXY>> count1table = granule.count1table_select ? MP3::Tables::Huffman::TreeB : MP3::Tables::Huffman::TreeA;
558
559 // count1 is not known. We have to read huffman encoded values
560 // until we've exhausted the granule's bits. We know the size of
561 // the granule from part2_3_length, which is the number of bits
562 // used for scaleactors and huffman data (in the granule).
563 while (granule_bits_read < granule.part_2_3_length && count <= MP3::granule_size - 4) {
564 auto const entry = MP3::Tables::Huffman::huffman_decode(reservoir, count1table, granule.part_2_3_length - granule_bits_read);
565 granule_bits_read += entry.bits_read;
566 if (!entry.code.has_value())
567 return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Frame contains invalid huffman data." };
568 int v = entry.code->symbol.v;
569 if (v != 0) {
570 if (granule_bits_read >= granule.part_2_3_length)
571 break;
572 if (LOADER_TRY(reservoir.read_bit()))
573 v = -v;
574 granule_bits_read++;
575 }
576 int w = entry.code->symbol.w;
577 if (w != 0) {
578 if (granule_bits_read >= granule.part_2_3_length)
579 break;
580 if (LOADER_TRY(reservoir.read_bit()))
581 w = -w;
582 granule_bits_read++;
583 }
584 int x = entry.code->symbol.x;
585 if (x != 0) {
586 if (granule_bits_read >= granule.part_2_3_length)
587 break;
588 if (LOADER_TRY(reservoir.read_bit()))
589 x = -x;
590 granule_bits_read++;
591 }
592 int y = entry.code->symbol.y;
593 if (y != 0) {
594 if (granule_bits_read >= granule.part_2_3_length)
595 break;
596 if (LOADER_TRY(reservoir.read_bit()))
597 y = -y;
598 granule_bits_read++;
599 }
600
601 granule.samples[count + 0] = requantize(v, exponents[count + 0]);
602 granule.samples[count + 1] = requantize(w, exponents[count + 1]);
603 granule.samples[count + 2] = requantize(x, exponents[count + 2]);
604 granule.samples[count + 3] = requantize(y, exponents[count + 3]);
605
606 count += 4;
607 }
608
609 if (granule_bits_read > granule.part_2_3_length) {
610 return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Read too many bits from bit reservoir." };
611 }
612
613 for (size_t i = granule_bits_read; i < granule.part_2_3_length; i++) {
614 LOADER_TRY(reservoir.read_bit());
615 }
616
617 return {};
618}
619
620void MP3LoaderPlugin::reorder_samples(MP3::Granule& granule, u32 sample_rate)
621{
622 float tmp[MP3::granule_size] = {};
623 size_t band_index = 0;
624 size_t subband_index = 0;
625
626 auto scale_factor_bands = get_scalefactor_bands(granule, sample_rate);
627
628 if (granule.mixed_block_flag) {
629 while (subband_index < 36) {
630 for (size_t frequency_line_index = 0; frequency_line_index < scale_factor_bands[band_index].width; frequency_line_index++) {
631 tmp[subband_index] = granule.samples[subband_index];
632 subband_index++;
633 }
634 band_index++;
635 }
636 }
637
638 while (subband_index < MP3::granule_size && band_index <= 36) {
639 for (size_t frequency_line_index = 0; frequency_line_index < scale_factor_bands[band_index].width; frequency_line_index++) {
640 tmp[subband_index++] = granule.samples[scale_factor_bands[band_index + 0].start + frequency_line_index];
641 tmp[subband_index++] = granule.samples[scale_factor_bands[band_index + 1].start + frequency_line_index];
642 tmp[subband_index++] = granule.samples[scale_factor_bands[band_index + 2].start + frequency_line_index];
643 }
644 band_index += 3;
645 }
646
647 for (size_t i = 0; i < MP3::granule_size; i++)
648 granule.samples[i] = tmp[i];
649}
650
651void MP3LoaderPlugin::reduce_alias(MP3::Granule& granule, size_t max_subband_index)
652{
653 for (size_t subband = 0; subband < max_subband_index - 18; subband += 18) {
654 for (size_t i = 0; i < 8; i++) {
655 size_t const idx1 = subband + 17 - i;
656 size_t const idx2 = subband + 18 + i;
657 auto const d1 = granule.samples[idx1];
658 auto const d2 = granule.samples[idx2];
659 granule.samples[idx1] = d1 * MP3::Tables::AliasReductionCs[i] - d2 * MP3::Tables::AliasReductionCa[i];
660 granule.samples[idx2] = d2 * MP3::Tables::AliasReductionCs[i] + d1 * MP3::Tables::AliasReductionCa[i];
661 }
662 }
663}
664
665void MP3LoaderPlugin::process_stereo(MP3::MP3Frame& frame, size_t granule_index)
666{
667 size_t band_index_ms_start = 0;
668 size_t band_index_ms_end = 0;
669 size_t band_index_intensity_start = 0;
670 size_t band_index_intensity_end = 0;
671 auto& granule_left = frame.channels[0].granules[granule_index];
672 auto& granule_right = frame.channels[1].granules[granule_index];
673
674 auto get_last_nonempty_band = [](Span<float> samples, ReadonlySpan<MP3::Tables::ScaleFactorBand> bands) -> size_t {
675 size_t last_nonempty_band = 0;
676
677 for (size_t i = 0; i < bands.size(); i++) {
678 bool is_empty = true;
679 for (size_t l = bands[i].start; l < bands[i].end; l++) {
680 if (samples[l] != 0) {
681 is_empty = false;
682 break;
683 }
684 }
685 if (!is_empty)
686 last_nonempty_band = i;
687 }
688
689 return last_nonempty_band;
690 };
691
692 auto process_ms_stereo = [&](MP3::Tables::ScaleFactorBand const& band) {
693 float const SQRT_2 = AK::sqrt(2.0);
694 for (size_t i = band.start; i <= band.end; i++) {
695 float const m = granule_left.samples[i];
696 float const s = granule_right.samples[i];
697 granule_left.samples[i] = (m + s) / SQRT_2;
698 granule_right.samples[i] = (m - s) / SQRT_2;
699 }
700 };
701
702 auto process_intensity_stereo = [&](MP3::Tables::ScaleFactorBand const& band, float intensity_stereo_ratio) {
703 for (size_t i = band.start; i <= band.end; i++) {
704 float const sample_left = granule_left.samples[i];
705 float const coeff_l = intensity_stereo_ratio / (1 + intensity_stereo_ratio);
706 float const coeff_r = 1 / (1 + intensity_stereo_ratio);
707 granule_left.samples[i] = sample_left * coeff_l;
708 granule_right.samples[i] = sample_left * coeff_r;
709 }
710 };
711
712 auto scale_factor_bands = get_scalefactor_bands(granule_right, frame.header.samplerate);
713
714 if (has_flag(frame.header.mode_extension, MP3::ModeExtension::MsStereo)) {
715 band_index_ms_start = 0;
716 band_index_ms_end = scale_factor_bands.size();
717 }
718
719 if (has_flag(frame.header.mode_extension, MP3::ModeExtension::IntensityStereo)) {
720 band_index_intensity_start = get_last_nonempty_band(granule_right.samples, scale_factor_bands);
721 band_index_intensity_end = scale_factor_bands.size();
722 band_index_ms_end = band_index_intensity_start;
723 }
724
725 for (size_t band_index = band_index_ms_start; band_index < band_index_ms_end; band_index++) {
726 process_ms_stereo(scale_factor_bands[band_index]);
727 }
728
729 for (size_t band_index = band_index_intensity_start; band_index < band_index_intensity_end; band_index++) {
730 auto const intensity_stereo_position = frame.channels[1].scale_factors[band_index];
731 if (intensity_stereo_position == 7) {
732 if (has_flag(frame.header.mode_extension, MP3::ModeExtension::MsStereo))
733 process_ms_stereo(scale_factor_bands[band_index]);
734 continue;
735 }
736 float const intensity_stereo_ratio = AK::tan(intensity_stereo_position * AK::Pi<float> / 12);
737 process_intensity_stereo(scale_factor_bands[band_index], intensity_stereo_ratio);
738 }
739}
740
741void MP3LoaderPlugin::transform_samples_to_time(Array<float, MP3::granule_size> const& input, size_t input_offset, Array<float, 36>& output, MP3::BlockType block_type)
742{
743 if (block_type == MP3::BlockType::Short) {
744 size_t const N = 12;
745 Array<float, N * 3> temp_out;
746 Array<float, N / 2> temp_in;
747
748 for (size_t k = 0; k < N / 2; k++)
749 temp_in[k] = input[input_offset + 3 * k + 0];
750 s_mdct_12.transform(temp_in, Span<float>(temp_out).slice(0, N));
751 for (size_t i = 0; i < N; i++)
752 temp_out[i + 0] *= MP3::Tables::WindowBlockTypeShort[i];
753
754 for (size_t k = 0; k < N / 2; k++)
755 temp_in[k] = input[input_offset + 3 * k + 1];
756 s_mdct_12.transform(temp_in, Span<float>(temp_out).slice(12, N));
757 for (size_t i = 0; i < N; i++)
758 temp_out[i + 12] *= MP3::Tables::WindowBlockTypeShort[i];
759
760 for (size_t k = 0; k < N / 2; k++)
761 temp_in[k] = input[input_offset + 3 * k + 2];
762 s_mdct_12.transform(temp_in, Span<float>(temp_out).slice(24, N));
763 for (size_t i = 0; i < N; i++)
764 temp_out[i + 24] *= MP3::Tables::WindowBlockTypeShort[i];
765
766 Span<float> idmct1 = Span<float>(temp_out).slice(0, 12);
767 Span<float> idmct2 = Span<float>(temp_out).slice(12, 12);
768 Span<float> idmct3 = Span<float>(temp_out).slice(24, 12);
769 for (size_t i = 0; i < 6; i++)
770 output[i] = 0;
771 for (size_t i = 6; i < 12; i++)
772 output[i] = idmct1[i - 6];
773 for (size_t i = 12; i < 18; i++)
774 output[i] = idmct1[i - 6] + idmct2[i - 12];
775 for (size_t i = 18; i < 24; i++)
776 output[i] = idmct2[i - 12] + idmct3[i - 18];
777 for (size_t i = 24; i < 30; i++)
778 output[i] = idmct3[i - 18];
779 for (size_t i = 30; i < 36; i++)
780 output[i] = 0;
781
782 } else {
783 s_mdct_36.transform(ReadonlySpan<float>(input).slice(input_offset, 18), output);
784 for (size_t i = 0; i < 36; i++) {
785 switch (block_type) {
786 case MP3::BlockType::Normal:
787 output[i] *= MP3::Tables::WindowBlockTypeNormal[i];
788 break;
789 case MP3::BlockType::Start:
790 output[i] *= MP3::Tables::WindowBlockTypeStart[i];
791 break;
792 case MP3::BlockType::End:
793 output[i] *= MP3::Tables::WindowBlockTypeEnd[i];
794 break;
795 case MP3::BlockType::Short:
796 VERIFY_NOT_REACHED();
797 break;
798 }
799 }
800 }
801}
802
803// ISO/IEC 11172-3 (Figure A.2)
804void MP3LoaderPlugin::synthesis(Array<float, 1024>& V, Array<float, 32>& samples, Array<float, 32>& result)
805{
806 for (size_t i = 1023; i >= 64; i--) {
807 V[i] = V[i - 64];
808 }
809
810 for (size_t i = 0; i < 64; i++) {
811 V[i] = 0;
812 for (size_t k = 0; k < 32; k++) {
813 float const N = MP3::Tables::SynthesisSubbandFilterCoefficients[i][k];
814 V[i] += N * samples[k];
815 }
816 }
817
818 Array<float, 512> U;
819 for (size_t i = 0; i < 8; i++) {
820 for (size_t j = 0; j < 32; j++) {
821 U[i * 64 + j] = V[i * 128 + j];
822 U[i * 64 + 32 + j] = V[i * 128 + 96 + j];
823 }
824 }
825
826 Array<float, 512> W;
827 for (size_t i = 0; i < 512; i++) {
828 W[i] = U[i] * MP3::Tables::WindowSynthesis[i];
829 }
830
831 for (size_t j = 0; j < 32; j++) {
832 result[j] = 0;
833 for (size_t k = 0; k < 16; k++) {
834 result[j] += W[j + 32 * k];
835 }
836 }
837}
838
839ReadonlySpan<MP3::Tables::ScaleFactorBand> MP3LoaderPlugin::get_scalefactor_bands(MP3::Granule const& granule, int samplerate)
840{
841 switch (granule.block_type) {
842 case MP3::BlockType::Short:
843 switch (samplerate) {
844 case 32000:
845 return granule.mixed_block_flag ? MP3::Tables::ScaleFactorBandMixed32000 : MP3::Tables::ScaleFactorBandShort32000;
846 case 44100:
847 return granule.mixed_block_flag ? MP3::Tables::ScaleFactorBandMixed44100 : MP3::Tables::ScaleFactorBandShort44100;
848 case 48000:
849 return granule.mixed_block_flag ? MP3::Tables::ScaleFactorBandMixed48000 : MP3::Tables::ScaleFactorBandShort48000;
850 }
851 break;
852 case MP3::BlockType::Normal:
853 [[fallthrough]];
854 case MP3::BlockType::Start:
855 [[fallthrough]];
856 case MP3::BlockType::End:
857 switch (samplerate) {
858 case 32000:
859 return MP3::Tables::ScaleFactorBandLong32000;
860 case 44100:
861 return MP3::Tables::ScaleFactorBandLong44100;
862 case 48000:
863 return MP3::Tables::ScaleFactorBandLong48000;
864 }
865 }
866 VERIFY_NOT_REACHED();
867}
868
869}