Enums.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. #define ENUMERATE_ALL() \
  13. ENUMERATE_ONE(FileTypeBox, ftyp) \
  14. ENUMERATE_ONE(MetaBox, meta) \
  15. ENUMERATE_ONE(MovieBox, moov) \
  16. ENUMERATE_ONE(MediaDataBox, mdat) \
  17. ENUMERATE_ONE(FreeBox, free)
  18. enum class BoxType : u32 {
  19. None = 0,
  20. #define ENUMERATE_ONE(box_name, box_4cc) box_name = RIFF::ChunkID(#box_4cc).as_big_endian_number(),
  21. ENUMERATE_ALL()
  22. #undef ENUMERATE_ONE
  23. };
  24. static bool is_valid_box_type(BoxType type)
  25. {
  26. return (
  27. #define ENUMERATE_ONE(box_name, _) type == BoxType::box_name ||
  28. ENUMERATE_ALL()
  29. #undef ENUMERATE_ONE
  30. false);
  31. }
  32. #undef ENUMERATE_ALL
  33. // Define all FileTypeBox brand identifiers:
  34. #define ENUMERATE_ALL() \
  35. ENUMERATE_ONE(iso8) \
  36. ENUMERATE_ONE(avif) \
  37. ENUMERATE_ONE(avis) \
  38. ENUMERATE_ONE(mif1) \
  39. ENUMERATE_ONE(msf1) \
  40. ENUMERATE_ONE(miaf) \
  41. ENUMERATE_ONE(MA1A)
  42. enum class BrandIdentifier : u32 {
  43. None = 0,
  44. #define ENUMERATE_ONE(brand_4cc) brand_4cc = RIFF::ChunkID(#brand_4cc).as_big_endian_number(),
  45. ENUMERATE_ALL()
  46. #undef ENUMERATE_ONE
  47. };
  48. #undef ENUMERATE_ALL
  49. }
  50. template<>
  51. struct AK::Formatter<Gfx::ISOBMFF::BoxType> : Formatter<FormatString> {
  52. ErrorOr<void> format(FormatBuilder& builder, Gfx::ISOBMFF::BoxType const& box_type)
  53. {
  54. StringView format_string = Gfx::ISOBMFF::is_valid_box_type(box_type) ? "('{}')"sv : "Unknown Box ('{}')"sv;
  55. return Formatter<FormatString>::format(builder, format_string, RIFF::ChunkID::from_big_endian_number(to_underlying(box_type)));
  56. }
  57. };
  58. template<>
  59. struct AK::Formatter<Gfx::ISOBMFF::BrandIdentifier> : Formatter<FormatString> {
  60. ErrorOr<void> format(FormatBuilder& builder, Gfx::ISOBMFF::BrandIdentifier const& brand_identifier)
  61. {
  62. return Formatter<FormatString>::format(builder, "{}"sv, RIFF::ChunkID::from_big_endian_number(to_underlying(brand_identifier)));
  63. }
  64. };