ladybird/Libraries/LibMedia/Demuxer.h
Zaggy1024 a4c2c6c0cb LibMedia+LibWeb: Speculatively find keyframes near fast seek targets
This is the new way of handling fast seeks. Instead of delegating the
logic all the way down the pipeline to the decoder thread's seek
handler, we can just determine the timestamp we want to seek to ahead
of time.
2026-05-13 02:05:35 -05:00

70 lines
2.2 KiB
C++

/*
* Copyright (c) 2022-2025, Gregory Bertilson <gregory@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/AtomicRefCounted.h>
#include <AK/EnumBits.h>
#include <AK/NonnullOwnPtr.h>
#include <AK/Time.h>
#include <LibCore/EventReceiver.h>
#include <LibMedia/IncrementallyPopulatedStream.h>
#include "CodecID.h"
#include "CodedFrame.h"
#include "DecoderError.h"
#include "SeekMode.h"
#include "TimeRanges.h"
#include "Track.h"
namespace Media {
enum class DemuxerSeekOptions : u8 {
None = 0,
Force = 1 << 0,
};
AK_ENUM_BITWISE_OPERATORS(DemuxerSeekOptions);
enum class DemuxerSeekResult : u8 {
MovedPosition,
KeptCurrentPosition,
};
class Demuxer : public AtomicRefCounted<Demuxer> {
public:
virtual ~Demuxer() = default;
virtual DecoderErrorOr<void> create_context_for_track(Track const&) = 0;
virtual DecoderErrorOr<Vector<Track>> get_tracks_for_type(TrackType) = 0;
// Returns the container's preferred track for a given track type. This must return a value if any track of the
// given type is present.
virtual DecoderErrorOr<Optional<Track>> get_preferred_track_for_type(TrackType) = 0;
virtual DecoderErrorOr<CodedFrame> get_next_sample_for_track(Track const&) = 0;
virtual DecoderErrorOr<CodecID> get_codec_id_for_track(Track const&) = 0;
virtual DecoderErrorOr<ReadonlyBytes> get_codec_initialization_data_for_track(Track const&) = 0;
virtual AK::Duration select_fast_seek_target_for_track(Track const&, AK::Duration target, SeekMode) = 0;
virtual DecoderErrorOr<DemuxerSeekResult> seek_to_most_recent_keyframe(Track const&, AK::Duration timestamp, DemuxerSeekOptions = DemuxerSeekOptions::None) = 0;
virtual DecoderErrorOr<AK::Duration> duration_of_track(Track const&) = 0;
virtual DecoderErrorOr<AK::Duration> total_duration() = 0;
// Returns the timeline offset if the media resource provides one.
virtual Optional<AK::UnixDateTime> start_time_realtime() const { return {}; }
virtual TimeRanges buffered_time_ranges() const = 0;
virtual void set_blocking_reads_aborted_for_track(Track const&) = 0;
virtual void reset_blocking_reads_aborted_for_track(Track const&) = 0;
virtual bool is_read_blocked_for_track(Track const&) = 0;
};
}