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.
70 lines
2.2 KiB
C++
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;
|
|
};
|
|
|
|
}
|