From b33a71a35e09602ab0e6bbbdf2b4ae43b0e808b5 Mon Sep 17 00:00:00 2001 From: Zaggy1024 Date: Sat, 26 Aug 2023 02:12:03 -0500 Subject: [PATCH] LibAudio: Remove unnecessary `m_bitstream` field from `MP3Loader` We can just create a `BigEndianInputBitStream` where it is needed instead of storing one in the class. After making `read_header()` static, the only other user of the field was `read_size_information()`, so let's do that there and then remove the field. --- Userland/Libraries/LibAudio/MP3Loader.cpp | 50 +++++++++++------------ Userland/Libraries/LibAudio/MP3Loader.h | 1 - 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/Userland/Libraries/LibAudio/MP3Loader.cpp b/Userland/Libraries/LibAudio/MP3Loader.cpp index 15dff69cf1..56926dda29 100644 --- a/Userland/Libraries/LibAudio/MP3Loader.cpp +++ b/Userland/Libraries/LibAudio/MP3Loader.cpp @@ -65,7 +65,6 @@ MaybeLoaderError MP3LoaderPlugin::initialize() { TRY(build_seek_table()); - m_bitstream = TRY(try_make(MaybeOwned(*m_stream))); TRY(seek(0)); auto header = TRY(synchronize_and_read_header()); @@ -84,7 +83,6 @@ MaybeLoaderError MP3LoaderPlugin::reset() m_synthesis_buffer = {}; m_loaded_samples = 0; TRY(m_bit_reservoir.discard(m_bit_reservoir.used_buffer_size())); - m_bitstream->align_to_byte_boundary(); return {}; } @@ -97,7 +95,6 @@ MaybeLoaderError MP3LoaderPlugin::seek(int const position) } m_synthesis_buffer = {}; TRY(m_bit_reservoir.discard(m_bit_reservoir.used_buffer_size())); - m_bitstream->align_to_byte_boundary(); return {}; } @@ -229,10 +226,7 @@ ErrorOr MP3LoaderPlugin::synchronize_and_read_header(S ErrorOr MP3LoaderPlugin::synchronize_and_read_header() { - auto header = TRY(MP3LoaderPlugin::synchronize_and_read_header(*m_stream, m_loaded_samples)); - if (m_bitstream) - m_bitstream->align_to_byte_boundary(); - return header; + return MP3LoaderPlugin::synchronize_and_read_header(*m_stream, m_loaded_samples); } ErrorOr MP3LoaderPlugin::read_next_frame() @@ -252,7 +246,7 @@ ErrorOr MP3LoaderPlugin::read_frame_data(MP3::Header auto& buffer = maybe_buffer.value(); size_t old_reservoir_size = m_bit_reservoir.used_buffer_size(); - TRY(m_bitstream->read_until_filled(buffer)); + TRY(m_stream->read_until_filled(buffer)); TRY(m_bit_reservoir.write_until_depleted(buffer)); // If we don't have enough data in the reservoir to process this frame, skip it (but keep the data). @@ -331,46 +325,48 @@ ErrorOr MP3LoaderPlugin::read_frame_data(MP3::Header MaybeLoaderError MP3LoaderPlugin::read_side_information(MP3::MP3Frame& frame) { - frame.main_data_begin = TRY(m_bitstream->read_bits(9)); + auto bitstream = BigEndianInputBitStream(MaybeOwned(*m_stream)); + + frame.main_data_begin = TRY(bitstream.read_bits(9)); if (frame.header.channel_count() == 1) { - frame.private_bits = TRY(m_bitstream->read_bits(5)); + frame.private_bits = TRY(bitstream.read_bits(5)); } else { - frame.private_bits = TRY(m_bitstream->read_bits(3)); + frame.private_bits = TRY(bitstream.read_bits(3)); } for (size_t channel_index = 0; channel_index < frame.header.channel_count(); channel_index++) { for (size_t scale_factor_selection_info_band = 0; scale_factor_selection_info_band < 4; scale_factor_selection_info_band++) { - frame.channels[channel_index].scale_factor_selection_info[scale_factor_selection_info_band] = TRY(m_bitstream->read_bit()); + frame.channels[channel_index].scale_factor_selection_info[scale_factor_selection_info_band] = TRY(bitstream.read_bit()); } } for (size_t granule_index = 0; granule_index < 2; granule_index++) { for (size_t channel_index = 0; channel_index < frame.header.channel_count(); channel_index++) { auto& granule = frame.channels[channel_index].granules[granule_index]; - granule.part_2_3_length = TRY(m_bitstream->read_bits(12)); - granule.big_values = TRY(m_bitstream->read_bits(9)); - granule.global_gain = TRY(m_bitstream->read_bits(8)); - granule.scalefac_compress = TRY(m_bitstream->read_bits(4)); - granule.window_switching_flag = TRY(m_bitstream->read_bit()); + granule.part_2_3_length = TRY(bitstream.read_bits(12)); + granule.big_values = TRY(bitstream.read_bits(9)); + granule.global_gain = TRY(bitstream.read_bits(8)); + granule.scalefac_compress = TRY(bitstream.read_bits(4)); + granule.window_switching_flag = TRY(bitstream.read_bit()); if (granule.window_switching_flag) { - granule.block_type = static_cast(TRY(m_bitstream->read_bits(2))); - granule.mixed_block_flag = TRY(m_bitstream->read_bit()); + granule.block_type = static_cast(TRY(bitstream.read_bits(2))); + granule.mixed_block_flag = TRY(bitstream.read_bit()); for (size_t region = 0; region < 2; region++) - granule.table_select[region] = TRY(m_bitstream->read_bits(5)); + granule.table_select[region] = TRY(bitstream.read_bits(5)); for (size_t window = 0; window < 3; window++) - granule.sub_block_gain[window] = TRY(m_bitstream->read_bits(3)); + granule.sub_block_gain[window] = TRY(bitstream.read_bits(3)); granule.region0_count = (granule.block_type == MP3::BlockType::Short && !granule.mixed_block_flag) ? 8 : 7; granule.region1_count = 36; } else { for (size_t region = 0; region < 3; region++) - granule.table_select[region] = TRY(m_bitstream->read_bits(5)); - granule.region0_count = TRY(m_bitstream->read_bits(4)); - granule.region1_count = TRY(m_bitstream->read_bits(3)); + granule.table_select[region] = TRY(bitstream.read_bits(5)); + granule.region0_count = TRY(bitstream.read_bits(4)); + granule.region1_count = TRY(bitstream.read_bits(3)); } - granule.preflag = TRY(m_bitstream->read_bit()); - granule.scalefac_scale = TRY(m_bitstream->read_bit()); - granule.count1table_select = TRY(m_bitstream->read_bit()); + granule.preflag = TRY(bitstream.read_bit()); + granule.scalefac_scale = TRY(bitstream.read_bit()); + granule.count1table_select = TRY(bitstream.read_bit()); } } return {}; diff --git a/Userland/Libraries/LibAudio/MP3Loader.h b/Userland/Libraries/LibAudio/MP3Loader.h index 8dc363c05a..f841744bb0 100644 --- a/Userland/Libraries/LibAudio/MP3Loader.h +++ b/Userland/Libraries/LibAudio/MP3Loader.h @@ -72,7 +72,6 @@ private: int m_total_samples { 0 }; size_t m_loaded_samples { 0 }; - OwnPtr m_bitstream; AllocatingMemoryStream m_bit_reservoir; };