/* * Copyright (c) 2022, Gregory Bertilson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include "Reader.h" namespace Video::Matroska { 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_mapped_file(NonnullOwnPtr mapped_file); static DecoderErrorOr> from_data(ReadonlyBytes data); MatroskaDemuxer(Reader&& reader) : m_reader(move(reader)) { } DecoderErrorOr> get_tracks_for_type(TrackType type) override; DecoderErrorOr> seek_to_most_recent_keyframe(Track track, Duration timestamp, Optional earliest_available_sample = OptionalNone()) override; DecoderErrorOr duration() override; DecoderErrorOr get_codec_id_for_track(Track track) override; protected: DecoderErrorOr> get_next_sample_for_track(Track track) override; private: struct TrackStatus { SampleIterator iterator; Optional block {}; size_t frame_index { 0 }; }; DecoderErrorOr get_track_status(Track track); CodecID get_codec_id_for_string(FlyString const& codec_id); Reader m_reader; HashMap m_track_statuses; }; }