Boxes.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright (c) 2023, Gregory Bertilson <Zaggy1024@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Boxes.h"
  7. #include "Reader.h"
  8. namespace Gfx::ISOBMFF {
  9. ErrorOr<BoxHeader> read_box_header(BoxStream& stream)
  10. {
  11. BoxHeader header;
  12. u64 total_size = TRY(stream.read_value<BigEndian<u32>>());
  13. header.type = TRY(stream.read_value<BigEndian<BoxType>>());
  14. u64 data_size_read = sizeof(u32) + sizeof(BoxType);
  15. if (total_size == 0) {
  16. header.contents_size = stream.remaining();
  17. } else {
  18. if (total_size == 1) {
  19. total_size = TRY(stream.read_value<BigEndian<u64>>());
  20. data_size_read += sizeof(u64);
  21. }
  22. header.contents_size = total_size - data_size_read;
  23. }
  24. return header;
  25. }
  26. void Box::dump(String const& prepend) const
  27. {
  28. outln("{}{}", prepend, box_type());
  29. }
  30. ErrorOr<void> FullBox::read_from_stream(BoxStream& stream)
  31. {
  32. u32 data = TRY(stream.read_value<BigEndian<u32>>());
  33. // unsigned int(8) version
  34. version = static_cast<u8>(data >> 24);
  35. // unsigned int(24) flags
  36. flags = data & 0xFFF;
  37. return {};
  38. }
  39. void FullBox::dump(String const& prepend) const
  40. {
  41. outln("{}{} (version = {}, flags = {:#x})", prepend, box_type(), version, flags);
  42. }
  43. static String add_indent(String const& string)
  44. {
  45. return MUST(String::formatted("{} ", string));
  46. }
  47. ErrorOr<void> UnknownBox::read_from_stream(BoxStream& stream)
  48. {
  49. m_contents_size = stream.remaining();
  50. TRY(stream.discard_remaining());
  51. return {};
  52. }
  53. void UnknownBox::dump(String const& prepend) const
  54. {
  55. Box::dump(prepend);
  56. auto indented_prepend = add_indent(prepend);
  57. outln("{}[ {} bytes ]", prepend, m_contents_size);
  58. }
  59. ErrorOr<void> FileTypeBox::read_from_stream(BoxStream& stream)
  60. {
  61. // unsigned int(32) major_brand;
  62. major_brand = TRY(stream.read_value<BigEndian<BrandIdentifier>>());
  63. // unsigned int(32) minor_version;
  64. minor_version = TRY(stream.read_value<BigEndian<u32>>());
  65. // unsigned int(32) compatible_brands[]; // to end of the box
  66. if (stream.remaining() % sizeof(BrandIdentifier) != 0)
  67. return Error::from_string_literal("FileTypeBox compatible_brands contains a partial brand");
  68. for (auto minor_brand_count = stream.remaining() / sizeof(BrandIdentifier); minor_brand_count > 0; minor_brand_count--)
  69. TRY(compatible_brands.try_append(TRY(stream.read_value<BigEndian<BrandIdentifier>>())));
  70. return {};
  71. }
  72. void FileTypeBox::dump(String const& prepend) const
  73. {
  74. Box::dump(prepend);
  75. auto indented_prepend = add_indent(prepend);
  76. outln("{}- major_brand = {}", prepend, major_brand);
  77. outln("{}- minor_version = {}", prepend, minor_version);
  78. StringBuilder compatible_brands_string;
  79. compatible_brands_string.append("- compatible_brands = { "sv);
  80. for (size_t i = 0; i < compatible_brands.size() - 1; i++)
  81. compatible_brands_string.appendff("{}, ", compatible_brands[i]);
  82. compatible_brands_string.appendff("{} }}", compatible_brands[compatible_brands.size() - 1]);
  83. outln("{}{}", prepend, compatible_brands_string.string_view());
  84. }
  85. ErrorOr<void> SuperBox::read_from_stream(BoxStream& stream)
  86. {
  87. auto reader = TRY(Gfx::ISOBMFF::Reader::create(MaybeOwned { stream }));
  88. m_child_boxes = TRY(reader.read_entire_file());
  89. return {};
  90. }
  91. void SuperBox::dump(String const& prepend) const
  92. {
  93. Box::dump(prepend);
  94. auto indented_prepend = add_indent(prepend);
  95. for (auto const& child_box : m_child_boxes)
  96. child_box->dump(indented_prepend);
  97. }
  98. }