From be9de58932dcdb7cfdc523ef4ab9cd8f3c07afec Mon Sep 17 00:00:00 2001 From: Zaggy1024 Date: Thu, 10 Nov 2022 16:58:53 -0600 Subject: [PATCH] LibVideo: Parse Matroska from ReadonlyBytes and keep the start position Keeping the entire Matroska stream available is a prerequisite to being able to stream from it and seek to cue points. --- .../Containers/Matroska/MatroskaDemuxer.cpp | 2 +- .../LibVideo/Containers/Matroska/Reader.cpp | 16 ++++++------ .../LibVideo/Containers/Matroska/Reader.h | 26 +++++++++---------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp b/Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp index a80977b720..76cefb622b 100644 --- a/Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp +++ b/Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp @@ -15,7 +15,7 @@ DecoderErrorOr> MatroskaDemuxer::from_file(String DecoderErrorOr> MatroskaDemuxer::from_data(ReadonlyBytes data) { - return make(TRY(Reader::parse_matroska_from_data(data.data(), data.size()))); + return make(TRY(Reader::parse_matroska_from_data(data))); } Vector MatroskaDemuxer::get_tracks_for_type(TrackType type) diff --git a/Userland/Libraries/LibVideo/Containers/Matroska/Reader.cpp b/Userland/Libraries/LibVideo/Containers/Matroska/Reader.cpp index f7ca9c8064..6db52d3935 100644 --- a/Userland/Libraries/LibVideo/Containers/Matroska/Reader.cpp +++ b/Userland/Libraries/LibVideo/Containers/Matroska/Reader.cpp @@ -58,12 +58,12 @@ constexpr u32 TIMESTAMP_ID = 0xE7; DecoderErrorOr> Reader::parse_matroska_from_file(StringView path) { auto mapped_file = DECODER_TRY(DecoderErrorCategory::IO, Core::MappedFile::map(path)); - return parse_matroska_from_data((u8*)mapped_file->data(), mapped_file->size()); + return parse_matroska_from_data(mapped_file->bytes()); } -DecoderErrorOr> Reader::parse_matroska_from_data(u8 const* data, size_t size) +DecoderErrorOr> Reader::parse_matroska_from_data(ReadonlyBytes data) { - Reader reader(data, size); + Reader reader(data); return reader.parse(); } @@ -426,9 +426,10 @@ ErrorOr Reader::Streamer::read_octet() dbgln_if(MATROSKA_TRACE_DEBUG, "Ran out of stream data"); return Error::from_string_literal("Stream is out of data"); } - m_size_remaining--; + u8 byte = *data(); m_octets_read.last()++; - return *(m_data_ptr++); + m_position++; + return byte; } ErrorOr Reader::Streamer::read_i16() @@ -438,7 +439,7 @@ ErrorOr Reader::Streamer::read_i16() ErrorOr Reader::Streamer::read_variable_size_integer(bool mask_length) { - dbgln_if(MATROSKA_TRACE_DEBUG, "Reading from offset {:p}", m_data_ptr); + dbgln_if(MATROSKA_TRACE_DEBUG, "Reading from offset {:p}", data()); auto length_descriptor = TRY(read_octet()); dbgln_if(MATROSKA_TRACE_DEBUG, "Reading VINT, first byte is {:#02x}", length_descriptor); if (length_descriptor == 0) @@ -495,9 +496,8 @@ ErrorOr Reader::Streamer::drop_octets(size_t num_octets) { if (remaining() < num_octets) return Error::from_string_literal("Tried to drop octets past the end of the stream"); - m_size_remaining -= num_octets; + m_position += num_octets; m_octets_read.last() += num_octets; - m_data_ptr += num_octets; return {}; } diff --git a/Userland/Libraries/LibVideo/Containers/Matroska/Reader.h b/Userland/Libraries/LibVideo/Containers/Matroska/Reader.h index c9dff987fa..50ed4ea1e8 100644 --- a/Userland/Libraries/LibVideo/Containers/Matroska/Reader.h +++ b/Userland/Libraries/LibVideo/Containers/Matroska/Reader.h @@ -20,28 +20,27 @@ namespace Video::Matroska { class Reader { public: - Reader(u8 const* data, size_t size) - : m_streamer(data, size) + Reader(ReadonlyBytes data) + : m_streamer(data) { } static DecoderErrorOr> parse_matroska_from_file(StringView path); - static DecoderErrorOr> parse_matroska_from_data(u8 const*, size_t); + static DecoderErrorOr> parse_matroska_from_data(ReadonlyBytes data); DecoderErrorOr> parse(); private: class Streamer { public: - Streamer(u8 const* data, size_t size) - : m_data_ptr(data) - , m_size_remaining(size) + Streamer(ReadonlyBytes data) + : m_data(data) { } - u8 const* data() { return m_data_ptr; } + u8 const* data() { return m_data.data() + m_position; } - char const* data_as_chars() { return reinterpret_cast(m_data_ptr); } + char const* data_as_chars() { return reinterpret_cast(data()); } size_t octets_read() { return m_octets_read.last(); } @@ -70,15 +69,14 @@ private: ErrorOr drop_octets(size_t num_octets); - bool at_end() const { return m_size_remaining == 0; } - bool has_octet() const { return m_size_remaining >= 1; } + bool at_end() const { return remaining() == 0; } + bool has_octet() const { return remaining() >= 1; } - size_t remaining() const { return m_size_remaining; } - void set_remaining(size_t remaining) { m_size_remaining = remaining; } + size_t remaining() const { return m_data.size() - m_position; } private: - u8 const* m_data_ptr { nullptr }; - size_t m_size_remaining { 0 }; + ReadonlyBytes m_data; + size_t m_position { 0 }; Vector m_octets_read { 0 }; };