MP3Loader.cpp 38 KB

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