@@ -88,7 +88,7 @@ MaybeLoaderError MP3LoaderPlugin::initialize()
88
88
89
89
TRY (seek (0 ));
90
90
TRY (synchronize ());
91
- auto header = TRY (read_header ());
91
+ auto header = TRY (read_header (*m_bitstream, 0 ));
92
92
if (header.id != 1 || header.layer != 3 )
93
93
return LoaderError { LoaderError::Category::Format, " Only MPEG-1 layer 3 supported." };
94
94
@@ -181,7 +181,7 @@ MaybeLoaderError MP3LoaderPlugin::build_seek_table()
181
181
while (!synchronize ().is_error ()) {
182
182
auto const frame_pos = -2 + TRY (m_stream->seek (0 , SeekMode::FromCurrentPosition));
183
183
184
- auto error_or_header = read_header ();
184
+ auto error_or_header = read_header (*m_bitstream, m_loaded_samples );
185
185
if (error_or_header.is_error () || error_or_header.value ().id != 1 || error_or_header.value ().layer != 3 ) {
186
186
continue ;
187
187
}
@@ -202,30 +202,30 @@ MaybeLoaderError MP3LoaderPlugin::build_seek_table()
202
202
return {};
203
203
}
204
204
205
- ErrorOr<MP3::Header, LoaderError> MP3LoaderPlugin::read_header ()
205
+ ErrorOr<MP3::Header, LoaderError> MP3LoaderPlugin::read_header (BigEndianInputBitStream& stream, size_t sample_index )
206
206
{
207
207
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 ))];
210
210
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 ))];
214
214
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 ))];
217
217
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 )));
226
226
header.header_size = 4 ;
227
227
if (!header.protection_bit ) {
228
- header.crc16 = TRY (m_bitstream-> read_bits <u16 >(16 ));
228
+ header.crc16 = TRY (stream. read_bits <u16 >(16 ));
229
229
header.header_size += 2 ;
230
230
}
231
231
header.frame_size = 144 * header.bitrate * 1000 / header.samplerate + header.padding_bit ;
@@ -259,7 +259,7 @@ ErrorOr<MP3::MP3Frame, LoaderError> MP3LoaderPlugin::read_next_frame()
259
259
// In the second case, the error will bubble up from read_frame_data().
260
260
while (true ) {
261
261
TRY (synchronize ());
262
- MP3::Header header = TRY (read_header ());
262
+ MP3::Header header = TRY (read_header (*m_bitstream, m_loaded_samples ));
263
263
if (header.id != 1 || header.layer != 3 ) {
264
264
continue ;
265
265
}
0 commit comments