Enums.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Copyright (c) 2023, Gregory Bertilson <Zaggy1024@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Endian.h>
  8. #include <AK/Types.h>
  9. #include <LibRIFF/ChunkID.h>
  10. namespace Gfx::ISOBMFF {
  11. // Define all Box types.
  12. // In FourCC-asciibetical order.
  13. // The JPEG2000 types are from T-REC-T.800-201511-S!!PDF-E.pdf, Table I.2 – Defined boxes
  14. #define ENUMERATE_ALL() \
  15. ENUMERATE_ONE(JPEG2000BitsPerComponentBox, "bpcc") \
  16. ENUMERATE_ONE(JPEG2000ChannelDefinitionBox, "cdef") \
  17. ENUMERATE_ONE(JPEG2000ComponentMappingBox, "cmap") \
  18. ENUMERATE_ONE(JPEG2000ColorSpecificationBox, "colr") \
  19. ENUMERATE_ONE(FreeBox, "free") \
  20. ENUMERATE_ONE(FileTypeBox, "ftyp") \
  21. ENUMERATE_ONE(JPEG2000ImageHeaderBox, "ihdr") \
  22. ENUMERATE_ONE(JPEG2000SignatureBox, "jP ") \
  23. ENUMERATE_ONE(JPEG2000ContiguousCodestreamBox, "jp2c") \
  24. ENUMERATE_ONE(JPEG2000HeaderBox, "jp2h") \
  25. ENUMERATE_ONE(JPEG2000IntellectualPropertyBox, "jp2i") \
  26. ENUMERATE_ONE(MediaDataBox, "mdat") \
  27. ENUMERATE_ONE(MetaBox, "meta") \
  28. ENUMERATE_ONE(MovieBox, "moov") \
  29. ENUMERATE_ONE(JPEG2000PaletteBox, "pclr") \
  30. ENUMERATE_ONE(JPEG2000ResolutionBox, "res ") \
  31. ENUMERATE_ONE(JPEG2000CaptureResolutionBox, "resc") \
  32. ENUMERATE_ONE(JPEG2000DefaultDisplayResolutionBox, "resd") \
  33. ENUMERATE_ONE(JPEG2000UUIDInfoBox, "uinf") \
  34. ENUMERATE_ONE(JPEG2000UUIDListBox, "ulst") \
  35. ENUMERATE_ONE(JPEG2000URLBox, "url ") \
  36. ENUMERATE_ONE(UserExtensionBox, "uuid") \
  37. ENUMERATE_ONE(XMLBox, "xml ")
  38. enum class BoxType : u32 {
  39. None = 0,
  40. #define ENUMERATE_ONE(box_name, box_4cc) box_name = RIFF::ChunkID(box_4cc).as_number(),
  41. ENUMERATE_ALL()
  42. #undef ENUMERATE_ONE
  43. };
  44. static bool is_valid_box_type(BoxType type)
  45. {
  46. return (
  47. #define ENUMERATE_ONE(box_name, _) type == BoxType::box_name ||
  48. ENUMERATE_ALL()
  49. #undef ENUMERATE_ONE
  50. false);
  51. }
  52. #undef ENUMERATE_ALL
  53. // Define all FileTypeBox brand identifiers:
  54. #define ENUMERATE_ALL() \
  55. ENUMERATE_ONE(iso8) \
  56. ENUMERATE_ONE(avif) \
  57. ENUMERATE_ONE(avis) \
  58. ENUMERATE_ONE(mif1) \
  59. ENUMERATE_ONE(msf1) \
  60. ENUMERATE_ONE(miaf) \
  61. ENUMERATE_ONE(MA1A)
  62. enum class BrandIdentifier : u32 {
  63. None = 0,
  64. #define ENUMERATE_ONE(brand_4cc) brand_4cc = RIFF::ChunkID(#brand_4cc).as_number(),
  65. ENUMERATE_ALL()
  66. #undef ENUMERATE_ONE
  67. };
  68. #undef ENUMERATE_ALL
  69. }
  70. template<>
  71. struct AK::Formatter<Gfx::ISOBMFF::BoxType> : Formatter<FormatString> {
  72. ErrorOr<void> format(FormatBuilder& builder, Gfx::ISOBMFF::BoxType const& box_type)
  73. {
  74. StringView format_string = Gfx::ISOBMFF::is_valid_box_type(box_type) ? "({})"sv : "Unknown Box ({})"sv;
  75. return Formatter<FormatString>::format(builder, format_string, RIFF::ChunkID::from_number(to_underlying(box_type)));
  76. }
  77. };
  78. template<>
  79. struct AK::Formatter<Gfx::ISOBMFF::BrandIdentifier> : Formatter<FormatString> {
  80. ErrorOr<void> format(FormatBuilder& builder, Gfx::ISOBMFF::BrandIdentifier const& brand_identifier)
  81. {
  82. return Formatter<FormatString>::format(builder, "{}"sv, RIFF::ChunkID::from_number(to_underlying(brand_identifier)));
  83. }
  84. };