MP3Loader.cpp 39 KB

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