Skip to content

Commit 1847155

Browse files
Zaggy1024trflynn89
authored andcommitted
LibAudio: Make MP3LoaderPlugin::read_header() static
This will allow us to use the function when sniffing for an MP3 file to enable consistent checks for valid frame headers.
1 parent e087d35 commit 1847155

File tree

2 files changed

+21
-21
lines changed

2 files changed

+21
-21
lines changed

Userland/Libraries/LibAudio/MP3Loader.cpp

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ MaybeLoaderError MP3LoaderPlugin::initialize()
8888

8989
TRY(seek(0));
9090
TRY(synchronize());
91-
auto header = TRY(read_header());
91+
auto header = TRY(read_header(*m_bitstream, 0));
9292
if (header.id != 1 || header.layer != 3)
9393
return LoaderError { LoaderError::Category::Format, "Only MPEG-1 layer 3 supported." };
9494

@@ -181,7 +181,7 @@ MaybeLoaderError MP3LoaderPlugin::build_seek_table()
181181
while (!synchronize().is_error()) {
182182
auto const frame_pos = -2 + TRY(m_stream->seek(0, SeekMode::FromCurrentPosition));
183183

184-
auto error_or_header = read_header();
184+
auto error_or_header = read_header(*m_bitstream, m_loaded_samples);
185185
if (error_or_header.is_error() || error_or_header.value().id != 1 || error_or_header.value().layer != 3) {
186186
continue;
187187
}
@@ -202,30 +202,30 @@ MaybeLoaderError MP3LoaderPlugin::build_seek_table()
202202
return {};
203203
}
204204

205-
ErrorOr<MP3::Header, LoaderError> MP3LoaderPlugin::read_header()
205+
ErrorOr<MP3::Header, LoaderError> MP3LoaderPlugin::read_header(BigEndianInputBitStream& stream, size_t sample_index)
206206
{
207207
MP3::Header header;
208-
header.id = TRY(m_bitstream->read_bit());
209-
header.layer = MP3::Tables::LayerNumberLookup[TRY(m_bitstream->read_bits(2))];
208+
header.id = TRY(stream.read_bit());
209+
header.layer = MP3::Tables::LayerNumberLookup[TRY(stream.read_bits(2))];
210210
if (header.layer <= 0)
211-
return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Frame header contains invalid layer number." };
212-
header.protection_bit = TRY(m_bitstream->read_bit());
213-
header.bitrate = MP3::Tables::BitratesPerLayerLookup[header.layer - 1][TRY(m_bitstream->read_bits(4))];
211+
return LoaderError { LoaderError::Category::Format, sample_index, "Frame header contains invalid layer number." };
212+
header.protection_bit = TRY(stream.read_bit());
213+
header.bitrate = MP3::Tables::BitratesPerLayerLookup[header.layer - 1][TRY(stream.read_bits(4))];
214214
if (header.bitrate <= 0)
215-
return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Frame header contains invalid bitrate." };
216-
header.samplerate = MP3::Tables::SampleratesLookup[TRY(m_bitstream->read_bits(2))];
215+
return LoaderError { LoaderError::Category::Format, sample_index, "Frame header contains invalid bitrate." };
216+
header.samplerate = MP3::Tables::SampleratesLookup[TRY(stream.read_bits(2))];
217217
if (header.samplerate <= 0)
218-
return LoaderError { LoaderError::Category::Format, m_loaded_samples, "Frame header contains invalid samplerate." };
219-
header.padding_bit = TRY(m_bitstream->read_bit());
220-
header.private_bit = TRY(m_bitstream->read_bit());
221-
header.mode = static_cast<MP3::Mode>(TRY(m_bitstream->read_bits(2)));
222-
header.mode_extension = static_cast<MP3::ModeExtension>(TRY(m_bitstream->read_bits(2)));
223-
header.copyright_bit = TRY(m_bitstream->read_bit());
224-
header.original_bit = TRY(m_bitstream->read_bit());
225-
header.emphasis = static_cast<MP3::Emphasis>(TRY(m_bitstream->read_bits(2)));
218+
return LoaderError { LoaderError::Category::Format, sample_index, "Frame header contains invalid samplerate." };
219+
header.padding_bit = TRY(stream.read_bit());
220+
header.private_bit = TRY(stream.read_bit());
221+
header.mode = static_cast<MP3::Mode>(TRY(stream.read_bits(2)));
222+
header.mode_extension = static_cast<MP3::ModeExtension>(TRY(stream.read_bits(2)));
223+
header.copyright_bit = TRY(stream.read_bit());
224+
header.original_bit = TRY(stream.read_bit());
225+
header.emphasis = static_cast<MP3::Emphasis>(TRY(stream.read_bits(2)));
226226
header.header_size = 4;
227227
if (!header.protection_bit) {
228-
header.crc16 = TRY(m_bitstream->read_bits<u16>(16));
228+
header.crc16 = TRY(stream.read_bits<u16>(16));
229229
header.header_size += 2;
230230
}
231231
header.frame_size = 144 * header.bitrate * 1000 / header.samplerate + header.padding_bit;
@@ -259,7 +259,7 @@ ErrorOr<MP3::MP3Frame, LoaderError> MP3LoaderPlugin::read_next_frame()
259259
// In the second case, the error will bubble up from read_frame_data().
260260
while (true) {
261261
TRY(synchronize());
262-
MP3::Header header = TRY(read_header());
262+
MP3::Header header = TRY(read_header(*m_bitstream, m_loaded_samples));
263263
if (header.id != 1 || header.layer != 3) {
264264
continue;
265265
}

Userland/Libraries/LibAudio/MP3Loader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ class MP3LoaderPlugin : public LoaderPlugin {
4343
MaybeLoaderError initialize();
4444
static MaybeLoaderError skip_id3(SeekableStream& stream);
4545
static MaybeLoaderError synchronize(BigEndianInputBitStream& stream, size_t sample_index);
46+
static ErrorOr<MP3::Header, LoaderError> read_header(BigEndianInputBitStream& stream, size_t sample_index);
4647
MaybeLoaderError synchronize();
4748
MaybeLoaderError build_seek_table();
48-
ErrorOr<MP3::Header, LoaderError> read_header();
4949
ErrorOr<MP3::MP3Frame, LoaderError> read_next_frame();
5050
ErrorOr<MP3::MP3Frame, LoaderError> read_frame_data(MP3::Header const&);
5151
MaybeLoaderError read_side_information(MP3::MP3Frame&);

0 commit comments

Comments
 (0)