mirror of
https://github.com/SerenityOS/serenity
synced 2026-04-25 17:15:42 +02:00
The following command was used to clang-format these files:
clang-format-20 -i $(find . \
-not \( -path "./\.*" -prune \) \
-not \( -path "./Base/*" -prune \) \
-not \( -path "./Build/*" -prune \) \
-not \( -path "./Toolchain/*" -prune \) \
-not \( -path "./Ports/*" -prune \) \
-type f -name "*.cpp" -o -name "*.mm" -o -name "*.h")
78 lines
2.9 KiB
C++
78 lines
2.9 KiB
C++
/*
|
|
* Copyright (c) 2023, Gregory Bertilson <Zaggy1024@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include "Reader.h"
|
|
#include "JPEG2000Boxes.h"
|
|
#include "JPEGXLBoxes.h"
|
|
#include <AK/Function.h>
|
|
|
|
namespace Gfx::ISOBMFF {
|
|
|
|
ErrorOr<Reader> Reader::create(MaybeOwned<SeekableStream> stream)
|
|
{
|
|
size_t size = TRY(stream->size());
|
|
return Reader(make<ConstrainedStream>(move(stream), size));
|
|
}
|
|
|
|
ErrorOr<Reader> Reader::create(MaybeOwned<ConstrainedStream> stream)
|
|
{
|
|
return Reader(move(stream));
|
|
}
|
|
|
|
ErrorOr<BoxList> Reader::read_entire_file()
|
|
{
|
|
auto make_top_level_box = [](BoxType type, ConstrainedStream& stream) -> ErrorOr<Optional<NonnullOwnPtr<Box>>> {
|
|
switch (type) {
|
|
case BoxType::FileTypeBox:
|
|
return TRY(FileTypeBox::create_from_stream(stream));
|
|
case BoxType::JPEG2000ContiguousCodestreamBox:
|
|
return TRY(JPEG2000ContiguousCodestreamBox::create_from_stream(stream));
|
|
case BoxType::JPEG2000HeaderBox:
|
|
return TRY(JPEG2000HeaderBox::create_from_stream(stream));
|
|
case BoxType::JPEG2000SignatureBox:
|
|
return TRY(JPEG2000SignatureBox::create_from_stream(stream));
|
|
case BoxType::JPEG2000UUIDInfoBox:
|
|
return TRY(JPEG2000UUIDInfoBox::create_from_stream(stream));
|
|
case BoxType::JPEGXLCodestreamBox:
|
|
return TRY(JPEGXLCodestreamBox::create_from_stream(stream));
|
|
case BoxType::JPEGXLLevelBox:
|
|
return TRY(JPEGXLLevelBox::create_from_stream(stream));
|
|
case BoxType::JPEGXLSignatureBox:
|
|
return TRY(JPEGXLSignatureBox::create_from_stream(stream));
|
|
case BoxType::UserExtensionBox:
|
|
return TRY(UserExtensionBox::create_from_stream(stream));
|
|
default:
|
|
return OptionalNone {};
|
|
}
|
|
};
|
|
return read_entire_file((ErrorOr<Optional<NonnullOwnPtr<Box>>> (*)(BoxType, ConstrainedStream&))(make_top_level_box));
|
|
}
|
|
|
|
ErrorOr<BoxList> Reader::read_entire_file(BoxCallback box_factory)
|
|
{
|
|
BoxList top_level_boxes;
|
|
|
|
while (!m_box_stream->is_eof()) {
|
|
auto box_header = TRY(read_box_header(*m_box_stream));
|
|
ConstrainedStream box_stream { MaybeOwned<Stream> { *m_box_stream }, static_cast<size_t>(box_header.contents_size) };
|
|
|
|
auto maybe_box = TRY(box_factory(box_header.type, box_stream));
|
|
if (maybe_box.has_value()) {
|
|
TRY(top_level_boxes.try_append(move(maybe_box.value())));
|
|
} else {
|
|
TRY(top_level_boxes.try_append(TRY(UnknownBox::create_from_stream(box_header.type, box_stream))));
|
|
}
|
|
|
|
if (!box_stream.is_eof()) {
|
|
dbgln("Reader did not consume all data for box type {}, {} bytes remaining", RIFF::ChunkID::from_number(to_underlying(box_header.type)), box_stream.remaining());
|
|
return Error::from_string_literal("Reader did not consume all data");
|
|
}
|
|
}
|
|
return top_level_boxes;
|
|
}
|
|
|
|
}
|