/* * Copyright (c) 2026-present, the Ladybird developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace Web::MediaSourceExtensions { class ByteStreamParser; struct DemuxedCodedFrame; class TrackBuffer; class TrackBufferDemuxer; // These enums are declared separately from the bindings to avoid including the entire prototype header here. // https://w3c.github.io/media-source/#dfn-append-state enum class AppendState : u8 { WaitingForSegment, ParsingInitSegment, ParsingMediaSegment, }; // https://w3c.github.io/media-source/#dom-appendmode enum class AppendMode : u8 { Segments, Sequence, }; struct InitializationSegmentTrack { Media::Track track; NonnullRefPtr demuxer; }; struct InitializationSegmentData { Vector audio_tracks; Vector video_tracks; Vector text_tracks; }; class SourceBufferProcessor : public AtomicRefCounted { public: SourceBufferProcessor(); ~SourceBufferProcessor(); void set_parser(NonnullOwnPtr&&); bool updating() const { return m_updating; } void set_updating(bool value) { m_updating = value; } AppendMode mode() const; bool is_parsing_media_segment() const; bool generate_timestamps_flag() const; AK::Duration group_end_timestamp() const; bool is_buffer_full() const; void set_mode(AppendMode); void set_generate_timestamps_flag(bool); void set_group_start_timestamp(Optional); bool first_initialization_segment_received_flag() const; void set_first_initialization_segment_received_flag(bool); void set_pending_initialization_segment_for_change_type_flag(bool); using DurationChangeCallback = Function; using InitializationSegmentCallback = Function; using AppendErrorCallback = Function; using CodedFrameProcessingDoneCallback = Function; using AppendDoneCallback = Function; void set_duration_change_callback(DurationChangeCallback); void set_first_initialization_segment_callback(InitializationSegmentCallback); void set_append_error_callback(AppendErrorCallback); void set_coded_frame_processing_done_callback(CodedFrameProcessingDoneCallback); void set_append_done_callback(AppendDoneCallback); void append_to_input_buffer(ReadonlyBytes); void run_segment_parser_loop(); void reset_parser_state(); void run_coded_frame_eviction(); void set_reached_end_of_stream(); void clear_reached_end_of_stream(); Media::TimeRanges buffered_ranges() const; private: void drop_consumed_bytes_from_input_buffer(); void unset_all_track_buffer_timestamps(); void set_need_random_access_point_flag_on_all_track_buffers(bool); void initialization_segment_received(); void run_coded_frame_processing(Vector&); // https://w3c.github.io/media-source/#dom-sourcebuffer-updating bool m_updating { false }; // https://w3c.github.io/media-source/#dfn-input-buffer ByteBuffer m_input_buffer; OwnPtr m_parser; NonnullRefPtr m_cursor; HashMap> m_track_buffers; DurationChangeCallback m_duration_change_callback; InitializationSegmentCallback m_first_initialization_segment_callback; AppendErrorCallback m_append_error_callback; CodedFrameProcessingDoneCallback m_coded_frame_processing_done_callback; AppendDoneCallback m_append_done_callback; // https://w3c.github.io/media-source/#dfn-append-state AppendState m_append_state { AppendState::WaitingForSegment }; // https://w3c.github.io/media-source/#dom-appendmode AppendMode m_mode { AppendMode::Segments }; // https://w3c.github.io/media-source/#dfn-group-start-timestamp Optional m_group_start_timestamp; // https://w3c.github.io/media-source/#dfn-group-end-timestamp AK::Duration m_group_end_timestamp; // https://w3c.github.io/media-source/#dfn-generate-timestamps-flag bool m_generate_timestamps_flag { false }; // https://w3c.github.io/media-source/#dfn-first-initialization-segment-received-flag bool m_first_initialization_segment_received_flag { false }; // https://w3c.github.io/media-source/#dfn-pending-initialization-segment-for-changetype-flag bool m_pending_initialization_segment_for_change_type_flag { false }; // https://w3c.github.io/media-source/#dfn-buffer-full-flag bool m_buffer_full_flag { false }; }; }