mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-19 01:08:18 +03:00
LibGfx/ISOBMFF: Make BoxStream MaybeOwn its stream
...and make Reader always have a BoxStream.
This commit is contained in:
parent
07750774cf
commit
15ba0a7e18
Notes:
sideshowbarker
2024-07-17 10:16:43 +09:00
Author: https://github.com/nico Commit: https://github.com/SerenityOS/serenity/commit/15ba0a7e18 Pull-request: https://github.com/SerenityOS/serenity/pull/23682 Reviewed-by: https://github.com/LucasChollet Reviewed-by: https://github.com/Zaggy1024 Reviewed-by: https://github.com/timschumi ✅
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user