LibGfx/ISOBMFF: Make BoxStream MaybeOwn its stream

...and make Reader always have a BoxStream.
This commit is contained in:
Nico Weber 2024-03-22 13:10:22 -04:00 committed by Tim Schumacher
parent 07750774cf
commit 15ba0a7e18
Notes: sideshowbarker 2024-07-17 10:16:43 +09:00
3 changed files with 15 additions and 16 deletions

View File

@ -6,24 +6,25 @@
#pragma once #pragma once
#include <AK/MaybeOwned.h>
#include <AK/Stream.h> #include <AK/Stream.h>
namespace Gfx::ISOBMFF { namespace Gfx::ISOBMFF {
class BoxStream final : public Stream { class BoxStream final : public Stream {
public: public:
explicit BoxStream(Stream& stream, size_t size) explicit BoxStream(MaybeOwned<Stream> stream, size_t size)
: m_stream(stream) : m_stream(move(stream))
, m_data_left(size) , m_data_left(size)
{ {
} }
virtual bool is_eof() const override { return m_stream.is_eof() || remaining() == 0; } virtual bool is_eof() const override { return m_stream->is_eof() || remaining() == 0; }
virtual bool is_open() const override { return m_stream.is_open(); } virtual bool is_open() const override { return m_stream->is_open(); }
virtual void close() override { m_stream.close(); } virtual void close() override { m_stream->close(); }
virtual ErrorOr<Bytes> read_some(Bytes bytes) override virtual ErrorOr<Bytes> read_some(Bytes bytes) override
{ {
auto read_bytes = TRY(m_stream.read_some(bytes)); auto read_bytes = TRY(m_stream->read_some(bytes));
m_data_left -= min(read_bytes.size(), m_data_left); m_data_left -= min(read_bytes.size(), m_data_left);
return read_bytes; return read_bytes;
} }
@ -41,7 +42,7 @@ public:
} }
private: private:
Stream& m_stream; MaybeOwned<Stream> m_stream;
size_t m_data_left; size_t m_data_left;
}; };

View File

@ -11,16 +11,16 @@ namespace Gfx::ISOBMFF {
ErrorOr<Reader> Reader::create(MaybeOwned<SeekableStream> stream) ErrorOr<Reader> Reader::create(MaybeOwned<SeekableStream> stream)
{ {
size_t size = TRY(stream->size()); size_t size = TRY(stream->size());
return Reader(move(stream), size); return Reader(make<BoxStream>(move(stream), size));
} }
ErrorOr<BoxList> Reader::read_entire_file() ErrorOr<BoxList> Reader::read_entire_file()
{ {
BoxList top_level_boxes; BoxList top_level_boxes;
while (!m_stream->is_eof()) { while (!m_box_stream->is_eof()) {
auto box_header = TRY(read_box_header(m_box_stream)); auto box_header = TRY(read_box_header(*m_box_stream));
BoxStream box_stream { m_box_stream, static_cast<size_t>(box_header.contents_size) }; BoxStream box_stream { MaybeOwned<Stream> { *m_box_stream }, static_cast<size_t>(box_header.contents_size) };
switch (box_header.type) { switch (box_header.type) {
case BoxType::FileTypeBox: case BoxType::FileTypeBox:

View File

@ -20,14 +20,12 @@ public:
ErrorOr<BoxList> read_entire_file(); ErrorOr<BoxList> read_entire_file();
private: private:
Reader(MaybeOwned<SeekableStream> stream, size_t size) Reader(MaybeOwned<BoxStream> stream)
: m_stream(move(stream)) : m_box_stream(move(stream))
, m_box_stream(*m_stream, size)
{ {
} }
MaybeOwned<SeekableStream> m_stream; MaybeOwned<BoxStream> m_box_stream;
BoxStream m_box_stream;
}; };
} }