Reader.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * Copyright (c) 2021, Hunter Salyer <thefalsehonesty@gmail.com>
  3. * Copyright (c) 2022, Gregory Bertilson <Zaggy1024@gmail.com>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/Debug.h>
  9. #include <AK/IntegralMath.h>
  10. #include <AK/NonnullOwnPtrVector.h>
  11. #include <AK/Optional.h>
  12. #include <AK/OwnPtr.h>
  13. #include <LibVideo/DecoderError.h>
  14. #include "Document.h"
  15. namespace Video::Matroska {
  16. class Reader {
  17. public:
  18. Reader(u8 const* data, size_t size)
  19. : m_streamer(data, size)
  20. {
  21. }
  22. static DecoderErrorOr<NonnullOwnPtr<MatroskaDocument>> parse_matroska_from_file(StringView path);
  23. static DecoderErrorOr<NonnullOwnPtr<MatroskaDocument>> parse_matroska_from_data(u8 const*, size_t);
  24. DecoderErrorOr<NonnullOwnPtr<MatroskaDocument>> parse();
  25. private:
  26. class Streamer {
  27. public:
  28. Streamer(u8 const* data, size_t size)
  29. : m_data_ptr(data)
  30. , m_size_remaining(size)
  31. {
  32. }
  33. u8 const* data() { return m_data_ptr; }
  34. char const* data_as_chars() { return reinterpret_cast<char const*>(m_data_ptr); }
  35. size_t octets_read() { return m_octets_read.last(); }
  36. void push_octets_read() { m_octets_read.append(0); }
  37. void pop_octets_read()
  38. {
  39. auto popped = m_octets_read.take_last();
  40. if (!m_octets_read.is_empty())
  41. m_octets_read.last() += popped;
  42. }
  43. ErrorOr<u8> read_octet();
  44. ErrorOr<i16> read_i16();
  45. ErrorOr<u64> read_variable_size_integer(bool mask_length = true);
  46. ErrorOr<i64> read_variable_size_signed_integer();
  47. ErrorOr<u64> read_u64();
  48. ErrorOr<double> read_float();
  49. ErrorOr<String> read_string();
  50. ErrorOr<void> read_unknown_element();
  51. ErrorOr<void> drop_octets(size_t num_octets);
  52. bool at_end() const { return m_size_remaining == 0; }
  53. bool has_octet() const { return m_size_remaining >= 1; }
  54. size_t remaining() const { return m_size_remaining; }
  55. void set_remaining(size_t remaining) { m_size_remaining = remaining; }
  56. private:
  57. u8 const* m_data_ptr { nullptr };
  58. size_t m_size_remaining { 0 };
  59. Vector<size_t> m_octets_read { 0 };
  60. };
  61. DecoderErrorOr<void> parse_master_element(StringView element_name, Function<DecoderErrorOr<void>(u64 element_id)> element_consumer);
  62. DecoderErrorOr<EBMLHeader> parse_ebml_header();
  63. DecoderErrorOr<void> parse_segment_elements(MatroskaDocument&);
  64. DecoderErrorOr<NonnullOwnPtr<SegmentInformation>> parse_information();
  65. DecoderErrorOr<void> parse_tracks(MatroskaDocument&);
  66. DecoderErrorOr<NonnullOwnPtr<TrackEntry>> parse_track_entry();
  67. DecoderErrorOr<TrackEntry::VideoTrack> parse_video_track_information();
  68. DecoderErrorOr<TrackEntry::ColorFormat> parse_video_color_information();
  69. DecoderErrorOr<TrackEntry::AudioTrack> parse_audio_track_information();
  70. DecoderErrorOr<NonnullOwnPtr<Cluster>> parse_cluster();
  71. DecoderErrorOr<NonnullOwnPtr<Block>> parse_simple_block();
  72. Streamer m_streamer;
  73. };
  74. }