Reader.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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/IntegralMath.h>
  9. #include <AK/Optional.h>
  10. #include <AK/OwnPtr.h>
  11. #include <LibCore/MappedFile.h>
  12. #include <LibVideo/DecoderError.h>
  13. #include "Document.h"
  14. namespace Video::Matroska {
  15. class SampleIterator;
  16. class Streamer;
  17. class Reader {
  18. public:
  19. typedef Function<DecoderErrorOr<IterationDecision>(TrackEntry const&)> TrackEntryCallback;
  20. static DecoderErrorOr<Reader> from_file(StringView path);
  21. static DecoderErrorOr<Reader> from_mapped_file(NonnullOwnPtr<Core::MappedFile> mapped_file);
  22. static DecoderErrorOr<Reader> from_data(ReadonlyBytes data);
  23. EBMLHeader const& header() const { return m_header.value(); }
  24. DecoderErrorOr<SegmentInformation> segment_information();
  25. DecoderErrorOr<void> for_each_track(TrackEntryCallback);
  26. DecoderErrorOr<void> for_each_track_of_type(TrackEntry::TrackType, TrackEntryCallback);
  27. DecoderErrorOr<TrackEntry> track_for_track_number(u64);
  28. DecoderErrorOr<size_t> track_count();
  29. DecoderErrorOr<SampleIterator> create_sample_iterator(u64 track_number);
  30. DecoderErrorOr<SampleIterator> seek_to_random_access_point(SampleIterator, Duration);
  31. DecoderErrorOr<Optional<Vector<CuePoint> const&>> cue_points_for_track(u64 track_number);
  32. DecoderErrorOr<bool> has_cues_for_track(u64 track_number);
  33. private:
  34. Reader(ReadonlyBytes data)
  35. : m_data(data)
  36. {
  37. }
  38. DecoderErrorOr<void> parse_initial_data();
  39. DecoderErrorOr<Optional<size_t>> find_first_top_level_element_with_id([[maybe_unused]] StringView element_name, u32 element_id);
  40. DecoderErrorOr<void> ensure_tracks_are_parsed();
  41. DecoderErrorOr<void> parse_tracks(Streamer&);
  42. DecoderErrorOr<void> parse_cues(Streamer&);
  43. DecoderErrorOr<void> ensure_cues_are_parsed();
  44. DecoderErrorOr<void> seek_to_cue_for_timestamp(SampleIterator&, Duration const&);
  45. RefPtr<Core::SharedMappedFile> m_mapped_file;
  46. ReadonlyBytes m_data;
  47. Optional<EBMLHeader> m_header;
  48. size_t m_segment_contents_position { 0 };
  49. size_t m_segment_contents_size { 0 };
  50. HashMap<u32, size_t> m_seek_entries;
  51. size_t m_last_top_level_element_position { 0 };
  52. Optional<SegmentInformation> m_segment_information;
  53. OrderedHashMap<u64, TrackEntry> m_tracks;
  54. // The vectors must be sorted by timestamp at all times.
  55. HashMap<u64, Vector<CuePoint>> m_cues;
  56. bool m_cues_have_been_parsed { false };
  57. };
  58. class SampleIterator {
  59. public:
  60. DecoderErrorOr<Block> next_block();
  61. Cluster const& current_cluster() { return *m_current_cluster; }
  62. Optional<Duration> const& last_timestamp() { return m_last_timestamp; }
  63. private:
  64. friend class Reader;
  65. SampleIterator(RefPtr<Core::SharedMappedFile> file, ReadonlyBytes data, TrackEntry track, u64 timestamp_scale, size_t position)
  66. : m_file(move(file))
  67. , m_data(data)
  68. , m_track(move(track))
  69. , m_segment_timestamp_scale(timestamp_scale)
  70. , m_position(position)
  71. {
  72. }
  73. DecoderErrorOr<void> seek_to_cue_point(CuePoint const& cue_point);
  74. RefPtr<Core::SharedMappedFile> m_file;
  75. ReadonlyBytes m_data;
  76. TrackEntry m_track;
  77. u64 m_segment_timestamp_scale { 0 };
  78. // Must always point to an element ID or the end of the stream.
  79. size_t m_position { 0 };
  80. Optional<Duration> m_last_timestamp;
  81. Optional<Cluster> m_current_cluster;
  82. };
  83. class Streamer {
  84. public:
  85. Streamer(ReadonlyBytes data)
  86. : m_data(data)
  87. {
  88. }
  89. u8 const* data() { return m_data.data() + m_position; }
  90. char const* data_as_chars() { return reinterpret_cast<char const*>(data()); }
  91. size_t octets_read() { return m_octets_read.last(); }
  92. void push_octets_read() { m_octets_read.append(0); }
  93. void pop_octets_read()
  94. {
  95. auto popped = m_octets_read.take_last();
  96. if (!m_octets_read.is_empty())
  97. m_octets_read.last() += popped;
  98. }
  99. ErrorOr<u8> read_octet();
  100. ErrorOr<i16> read_i16();
  101. ErrorOr<u64> read_variable_size_integer(bool mask_length = true);
  102. ErrorOr<i64> read_variable_size_signed_integer();
  103. ErrorOr<u64> read_u64();
  104. ErrorOr<double> read_float();
  105. ErrorOr<ByteString> read_string();
  106. ErrorOr<void> read_unknown_element();
  107. ErrorOr<ReadonlyBytes> read_raw_octets(size_t num_octets);
  108. size_t position() const { return m_position; }
  109. size_t remaining() const { return m_data.size() - position(); }
  110. bool at_end() const { return remaining() == 0; }
  111. bool has_octet() const { return remaining() >= 1; }
  112. ErrorOr<void> seek_to_position(size_t position);
  113. private:
  114. ReadonlyBytes m_data;
  115. size_t m_position { 0 };
  116. Vector<size_t> m_octets_read { 0 };
  117. };
  118. }