Reader.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2023, Gregory Bertilson <Zaggy1024@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Reader.h"
  7. namespace Gfx::ISOBMFF {
  8. ErrorOr<Reader> Reader::create(MaybeOwned<SeekableStream> stream)
  9. {
  10. size_t size = TRY(stream->size());
  11. return Reader(make<BoxStream>(move(stream), size));
  12. }
  13. ErrorOr<Reader> Reader::create(MaybeOwned<BoxStream> stream)
  14. {
  15. return Reader(move(stream));
  16. }
  17. ErrorOr<BoxList> Reader::read_entire_file()
  18. {
  19. BoxList top_level_boxes;
  20. while (!m_box_stream->is_eof()) {
  21. auto box_header = TRY(read_box_header(*m_box_stream));
  22. BoxStream box_stream { MaybeOwned<Stream> { *m_box_stream }, static_cast<size_t>(box_header.contents_size) };
  23. switch (box_header.type) {
  24. case BoxType::FileTypeBox:
  25. TRY(top_level_boxes.try_append(TRY(FileTypeBox::create_from_stream(box_stream))));
  26. break;
  27. case BoxType::JPEG2000HeaderBox:
  28. TRY(top_level_boxes.try_append(TRY(SuperBox::create_from_stream(box_header.type, box_stream))));
  29. break;
  30. default:
  31. TRY(top_level_boxes.try_append(TRY(UnknownBox::create_from_stream(box_header.type, box_stream))));
  32. break;
  33. }
  34. if (!box_stream.is_eof())
  35. return Error::from_string_literal("Reader did not consume all data");
  36. }
  37. return top_level_boxes;
  38. }
  39. }