MatroskaDemuxer.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*
  2. * Copyright (c) 2022, Gregory Bertilson <zaggy1024@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/HashMap.h>
  8. #include <LibVideo/Containers/Demuxer.h>
  9. #include "Reader.h"
  10. namespace Video::Matroska {
  11. class MatroskaDemuxer final : public Demuxer {
  12. public:
  13. // FIXME: We should instead accept some abstract data streaming type so that the demuxer
  14. // can work with non-contiguous data.
  15. static DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> from_file(StringView filename);
  16. static DecoderErrorOr<NonnullOwnPtr<MatroskaDemuxer>> from_data(ReadonlyBytes data);
  17. MatroskaDemuxer(Reader&& reader)
  18. : m_reader(move(reader))
  19. {
  20. }
  21. DecoderErrorOr<Vector<Track>> get_tracks_for_type(TrackType type) override;
  22. DecoderErrorOr<Optional<Time>> seek_to_most_recent_keyframe(Track track, Time timestamp, Optional<Time> earliest_available_sample = OptionalNone()) override;
  23. DecoderErrorOr<Time> duration() override;
  24. protected:
  25. DecoderErrorOr<NonnullOwnPtr<Sample>> get_next_sample_for_track(Track track) override;
  26. private:
  27. struct TrackStatus {
  28. SampleIterator iterator;
  29. Optional<Block> block {};
  30. size_t frame_index { 0 };
  31. };
  32. DecoderErrorOr<TrackStatus*> get_track_status(Track track);
  33. Reader m_reader;
  34. HashMap<Track, TrackStatus> m_track_statuses;
  35. };
  36. }