mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 13:17:35 +00:00
LibAudio: Skip MP3 frames if not enough historic data is available
This commit is contained in:
parent
4ad9fbc6a5
commit
4dcc26e940
2 changed files with 6 additions and 7 deletions
|
@ -86,7 +86,6 @@ MaybeLoaderError MP3LoaderPlugin::seek(int const position)
|
||||||
m_synthesis_buffer = {};
|
m_synthesis_buffer = {};
|
||||||
m_bit_reservoir.discard_or_error(m_bit_reservoir.size());
|
m_bit_reservoir.discard_or_error(m_bit_reservoir.size());
|
||||||
m_bit_reservoir.handle_any_error();
|
m_bit_reservoir.handle_any_error();
|
||||||
m_is_first_frame = true;
|
|
||||||
m_bitstream->align_to_byte_boundary();
|
m_bitstream->align_to_byte_boundary();
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -108,7 +107,6 @@ LoaderSamples MP3LoaderPlugin::get_more_samples(size_t max_samples_to_read_from_
|
||||||
m_current_frame = maybe_frame.release_value();
|
m_current_frame = maybe_frame.release_value();
|
||||||
if (!m_current_frame.has_value())
|
if (!m_current_frame.has_value())
|
||||||
break;
|
break;
|
||||||
m_is_first_frame = false;
|
|
||||||
m_current_frame_read = 0;
|
m_current_frame_read = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,11 +217,11 @@ ErrorOr<MP3::MP3Frame, LoaderError> MP3LoaderPlugin::read_next_frame()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return read_frame_data(header, m_is_first_frame);
|
return read_frame_data(header);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<MP3::MP3Frame, LoaderError> MP3LoaderPlugin::read_frame_data(MP3::Header const& header, bool is_first_frame)
|
ErrorOr<MP3::MP3Frame, LoaderError> MP3LoaderPlugin::read_frame_data(MP3::Header const& header)
|
||||||
{
|
{
|
||||||
MP3::MP3Frame frame { header };
|
MP3::MP3Frame frame { header };
|
||||||
|
|
||||||
|
@ -239,8 +237,10 @@ ErrorOr<MP3::MP3Frame, LoaderError> MP3LoaderPlugin::read_frame_data(MP3::Header
|
||||||
if (m_bit_reservoir.write(buffer) != header.slot_count)
|
if (m_bit_reservoir.write(buffer) != header.slot_count)
|
||||||
return LoaderError { LoaderError::Category::IO, m_loaded_samples, "Could not write frame into bit reservoir." };
|
return LoaderError { LoaderError::Category::IO, m_loaded_samples, "Could not write frame into bit reservoir." };
|
||||||
|
|
||||||
if (frame.main_data_begin > 0 && is_first_frame)
|
// If we don't have enough data in the reservoir to process this frame, skip it (but keep the data).
|
||||||
|
if (old_reservoir_size < static_cast<size_t>(frame.main_data_begin))
|
||||||
return frame;
|
return frame;
|
||||||
|
|
||||||
if (!m_bit_reservoir.discard_or_error(old_reservoir_size - frame.main_data_begin))
|
if (!m_bit_reservoir.discard_or_error(old_reservoir_size - frame.main_data_begin))
|
||||||
return LoaderError { LoaderError::Category::IO, m_loaded_samples, "Could not discard old frame data." };
|
return LoaderError { LoaderError::Category::IO, m_loaded_samples, "Could not discard old frame data." };
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ private:
|
||||||
MaybeLoaderError build_seek_table();
|
MaybeLoaderError build_seek_table();
|
||||||
ErrorOr<MP3::Header, LoaderError> read_header();
|
ErrorOr<MP3::Header, LoaderError> read_header();
|
||||||
ErrorOr<MP3::MP3Frame, LoaderError> read_next_frame();
|
ErrorOr<MP3::MP3Frame, LoaderError> read_next_frame();
|
||||||
ErrorOr<MP3::MP3Frame, LoaderError> read_frame_data(MP3::Header const&, bool is_first_frame);
|
ErrorOr<MP3::MP3Frame, LoaderError> read_frame_data(MP3::Header const&);
|
||||||
MaybeLoaderError read_side_information(MP3::MP3Frame&);
|
MaybeLoaderError read_side_information(MP3::MP3Frame&);
|
||||||
ErrorOr<size_t, LoaderError> read_scale_factors(MP3::MP3Frame&, InputBitStream& reservoir, size_t granule_index, size_t channel_index);
|
ErrorOr<size_t, LoaderError> read_scale_factors(MP3::MP3Frame&, InputBitStream& reservoir, size_t granule_index, size_t channel_index);
|
||||||
MaybeLoaderError read_huffman_data(MP3::MP3Frame&, InputBitStream& reservoir, size_t granule_index, size_t channel_index, size_t granule_bits_read);
|
MaybeLoaderError read_huffman_data(MP3::MP3Frame&, InputBitStream& reservoir, size_t granule_index, size_t channel_index, size_t granule_bits_read);
|
||||||
|
@ -70,7 +70,6 @@ private:
|
||||||
PcmSampleFormat m_sample_format { PcmSampleFormat::Int16 };
|
PcmSampleFormat m_sample_format { PcmSampleFormat::Int16 };
|
||||||
int m_total_samples { 0 };
|
int m_total_samples { 0 };
|
||||||
size_t m_loaded_samples { 0 };
|
size_t m_loaded_samples { 0 };
|
||||||
bool m_is_first_frame { true };
|
|
||||||
|
|
||||||
AK::Optional<MP3::MP3Frame> m_current_frame;
|
AK::Optional<MP3::MP3Frame> m_current_frame;
|
||||||
u32 m_current_frame_read;
|
u32 m_current_frame_read;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue