1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 23:27:43 +00:00

LibVideo: Make Matroska element parsing functions static

Making these functions static makes it easier to implement lazy-loading
since the parsing functions can now be called at any time.

The functions were reorganized because they were not defined in the
order they are called. However, instead of moving every function to
that order, I've declared some but defined them further into the file,
which allows the next commit's diff to be more readable.
This commit is contained in:
Zaggy1024 2022-11-11 19:09:53 -06:00 committed by Andreas Kling
parent be9de58932
commit f4c476b26f
2 changed files with 211 additions and 219 deletions

View file

@ -18,6 +18,55 @@
namespace Video::Matroska {
class Streamer {
public:
Streamer(ReadonlyBytes data)
: m_data(data)
{
}
u8 const* data() { return m_data.data() + m_position; }
char const* data_as_chars() { return reinterpret_cast<char const*>(data()); }
size_t octets_read() { return m_octets_read.last(); }
void push_octets_read() { m_octets_read.append(0); }
void pop_octets_read()
{
auto popped = m_octets_read.take_last();
if (!m_octets_read.is_empty())
m_octets_read.last() += popped;
}
ErrorOr<u8> read_octet();
ErrorOr<i16> read_i16();
ErrorOr<u64> read_variable_size_integer(bool mask_length = true);
ErrorOr<i64> read_variable_size_signed_integer();
ErrorOr<u64> read_u64();
ErrorOr<double> read_float();
ErrorOr<String> read_string();
ErrorOr<void> read_unknown_element();
ErrorOr<void> drop_octets(size_t num_octets);
bool at_end() const { return remaining() == 0; }
bool has_octet() const { return remaining() >= 1; }
size_t remaining() const { return m_data.size() - m_position; }
private:
ReadonlyBytes m_data;
size_t m_position { 0 };
Vector<size_t> m_octets_read { 0 };
};
class Reader {
public:
Reader(ReadonlyBytes data)
@ -31,69 +80,6 @@ public:
DecoderErrorOr<NonnullOwnPtr<MatroskaDocument>> parse();
private:
class Streamer {
public:
Streamer(ReadonlyBytes data)
: m_data(data)
{
}
u8 const* data() { return m_data.data() + m_position; }
char const* data_as_chars() { return reinterpret_cast<char const*>(data()); }
size_t octets_read() { return m_octets_read.last(); }
void push_octets_read() { m_octets_read.append(0); }
void pop_octets_read()
{
auto popped = m_octets_read.take_last();
if (!m_octets_read.is_empty())
m_octets_read.last() += popped;
}
ErrorOr<u8> read_octet();
ErrorOr<i16> read_i16();
ErrorOr<u64> read_variable_size_integer(bool mask_length = true);
ErrorOr<i64> read_variable_size_signed_integer();
ErrorOr<u64> read_u64();
ErrorOr<double> read_float();
ErrorOr<String> read_string();
ErrorOr<void> read_unknown_element();
ErrorOr<void> drop_octets(size_t num_octets);
bool at_end() const { return remaining() == 0; }
bool has_octet() const { return remaining() >= 1; }
size_t remaining() const { return m_data.size() - m_position; }
private:
ReadonlyBytes m_data;
size_t m_position { 0 };
Vector<size_t> m_octets_read { 0 };
};
DecoderErrorOr<void> parse_master_element(StringView element_name, Function<DecoderErrorOr<void>(u64 element_id)> element_consumer);
DecoderErrorOr<EBMLHeader> parse_ebml_header();
DecoderErrorOr<void> parse_segment_elements(MatroskaDocument&);
DecoderErrorOr<NonnullOwnPtr<SegmentInformation>> parse_information();
DecoderErrorOr<void> parse_tracks(MatroskaDocument&);
DecoderErrorOr<NonnullOwnPtr<TrackEntry>> parse_track_entry();
DecoderErrorOr<TrackEntry::VideoTrack> parse_video_track_information();
DecoderErrorOr<TrackEntry::ColorFormat> parse_video_color_information();
DecoderErrorOr<TrackEntry::AudioTrack> parse_audio_track_information();
DecoderErrorOr<NonnullOwnPtr<Cluster>> parse_cluster();
DecoderErrorOr<NonnullOwnPtr<Block>> parse_simple_block();
Streamer m_streamer;
};