/* * Copyright (c) 2022, Gregory Bertilson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include "Demuxer.h" #include "MatroskaReader.h" namespace Video { class MatroskaDemuxer final : public Demuxer { public: // FIXME: We should instead accept some abstract data streaming type so that the demuxer // can work with non-contiguous data. static DecoderErrorOr> from_file(StringView filename); static DecoderErrorOr> from_data(Span data); MatroskaDemuxer(NonnullOwnPtr& document) : m_document(move(document)) { } Vector get_tracks_for_type(TrackType type) override; DecoderErrorOr seek_to_most_recent_keyframe(Track track, size_t timestamp) override; Time duration() override; protected: DecoderErrorOr> get_next_sample_for_track(Track track) override; private: struct TrackStatus { size_t m_cluster_index { 0 }; size_t m_block_index { 0 }; size_t m_frame_index { 0 }; }; ErrorOr get_track_status(Track track); NonnullOwnPtr m_document; HashMap m_track_statuses; }; }