MP3Loader.cpp 39 KB

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