MP3Loader.h 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright (c) 2021, Arne Elster <arne@elster.li>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include "Loader.h"
  8. #include "MP3Types.h"
  9. #include <AK/BitStream.h>
  10. #include <AK/MemoryStream.h>
  11. #include <AK/Tuple.h>
  12. #include <LibDSP/MDCT.h>
  13. namespace Audio {
  14. namespace MP3::Tables {
  15. struct ScaleFactorBand;
  16. }
  17. class MP3LoaderPlugin : public LoaderPlugin {
  18. public:
  19. explicit MP3LoaderPlugin(NonnullOwnPtr<SeekableStream> stream);
  20. virtual ~MP3LoaderPlugin() = default;
  21. static Result<NonnullOwnPtr<MP3LoaderPlugin>, LoaderError> create(StringView path);
  22. static Result<NonnullOwnPtr<MP3LoaderPlugin>, LoaderError> create(Bytes buffer);
  23. virtual ErrorOr<Vector<FixedArray<Sample>>, LoaderError> load_chunks(size_t samples_to_read_from_input) override;
  24. virtual MaybeLoaderError reset() override;
  25. virtual MaybeLoaderError seek(int const position) override;
  26. virtual int loaded_samples() override { return m_loaded_samples; }
  27. virtual int total_samples() override { return m_total_samples; }
  28. virtual u32 sample_rate() override { return m_sample_rate; }
  29. virtual u16 num_channels() override { return m_num_channels; }
  30. virtual PcmSampleFormat pcm_format() override { return m_sample_format; }
  31. virtual DeprecatedString format_name() override { return "MP3 (.mp3)"; }
  32. private:
  33. MaybeLoaderError initialize();
  34. MaybeLoaderError synchronize();
  35. MaybeLoaderError build_seek_table();
  36. ErrorOr<MP3::Header, LoaderError> read_header();
  37. ErrorOr<MP3::MP3Frame, LoaderError> read_next_frame();
  38. ErrorOr<MP3::MP3Frame, LoaderError> read_frame_data(MP3::Header const&);
  39. MaybeLoaderError read_side_information(MP3::MP3Frame&);
  40. ErrorOr<size_t, LoaderError> read_scale_factors(MP3::MP3Frame&, BigEndianInputBitStream& reservoir, size_t granule_index, size_t channel_index);
  41. MaybeLoaderError read_huffman_data(MP3::MP3Frame&, BigEndianInputBitStream& reservoir, size_t granule_index, size_t channel_index, size_t granule_bits_read);
  42. static AK::Array<float, 576> calculate_frame_exponents(MP3::MP3Frame const&, size_t granule_index, size_t channel_index);
  43. static void reorder_samples(MP3::Granule&, u32 sample_rate);
  44. static void reduce_alias(MP3::Granule&, size_t max_subband_index = 576);
  45. static void process_stereo(MP3::MP3Frame&, size_t granule_index);
  46. static void transform_samples_to_time(Array<float, 576> const& input, size_t input_offset, Array<float, 36>& output, MP3::BlockType block_type);
  47. static void synthesis(Array<float, 1024>& V, Array<float, 32>& samples, Array<float, 32>& result);
  48. static ReadonlySpan<MP3::Tables::ScaleFactorBand> get_scalefactor_bands(MP3::Granule const&, int samplerate);
  49. SeekTable m_seek_table;
  50. AK::Array<AK::Array<AK::Array<float, 18>, 32>, 2> m_last_values {};
  51. AK::Array<AK::Array<float, 1024>, 2> m_synthesis_buffer {};
  52. static DSP::MDCT<36> s_mdct_36;
  53. static DSP::MDCT<12> s_mdct_12;
  54. u32 m_sample_rate { 0 };
  55. u8 m_num_channels { 0 };
  56. PcmSampleFormat m_sample_format { PcmSampleFormat::Int16 };
  57. int m_total_samples { 0 };
  58. size_t m_loaded_samples { 0 };
  59. AK::Optional<MP3::MP3Frame> m_current_frame;
  60. OwnPtr<BigEndianInputBitStream> m_bitstream;
  61. AllocatingMemoryStream m_bit_reservoir;
  62. };
  63. }