/* * Copyright (c) 2026-present, the Ladybird developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Web::MediaSourceExtensions { // https://w3c.github.io/mse-byte-stream-format-webm/ class WebMByteStreamParser final : public ByteStreamParser { public: WebMByteStreamParser(); virtual ~WebMByteStreamParser() override; virtual Media::DecoderErrorOr skip_ignored_bytes(Media::MediaStreamCursor&) override; virtual Media::DecoderErrorOr sniff_segment_type(Media::MediaStreamCursor&) override; virtual Media::DecoderErrorOr parse_initialization_segment(Media::MediaStreamCursor&) override; virtual Media::DecoderErrorOr parse_media_segment(Media::MediaStreamCursor&) override; virtual Optional duration() const override { if (!m_segment_information.has_value()) return {}; auto duration = m_segment_information->duration(); if (!duration.has_value()) return {}; return duration; } virtual Media::CodecID codec_id_for_track(u64 track_number) const override { auto entry = m_track_entries.get(track_number); if (!entry.has_value()) return Media::CodecID::Unknown; return Media::Matroska::codec_id_from_matroska_id_string((*entry)->codec_id()); } virtual ReadonlyBytes codec_initialization_data_for_track(u64 track_number) const override { auto entry = m_track_entries.get(track_number); if (!entry.has_value()) return {}; return (*entry)->codec_private_data(); } virtual Vector const& video_tracks() const override { return m_video_tracks; } virtual Vector const& audio_tracks() const override { return m_audio_tracks; } virtual Vector const& text_tracks() const override { return m_text_tracks; } private: Optional m_segment_information; OrderedHashMap> m_track_entries; Media::Matroska::TrackBlockContexts m_track_block_contexts; Vector m_video_tracks; Vector m_audio_tracks; Vector m_text_tracks; struct MediaSegmentParsingData { AK::Duration timecode; Optional remaining_bytes; HashTable seen_track_numbers {}; AK::Duration last_block_timestamp { AK::Duration::min() }; }; Optional m_current_media_segment_data; bool m_cluster_has_been_read { false }; }; }