/* * Copyright (c) 2025, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include extern "C" { #include #include } namespace Media::FFmpeg { class FFmpegDemuxer : public Demuxer { public: static ErrorOr> create(NonnullOwnPtr stream); FFmpegDemuxer(NonnullOwnPtr stream, NonnullOwnPtr); virtual ~FFmpegDemuxer() override; virtual DecoderErrorOr> get_tracks_for_type(TrackType type) override; virtual DecoderErrorOr> seek_to_most_recent_keyframe(Track track, AK::Duration timestamp, Optional earliest_available_sample = OptionalNone()) override; virtual DecoderErrorOr duration(Track track) override; virtual DecoderErrorOr get_codec_id_for_track(Track track) override; virtual DecoderErrorOr get_codec_initialization_data_for_track(Track track) override; virtual DecoderErrorOr get_next_sample_for_track(Track track) override; private: DecoderErrorOr duration_of_track_in_milliseconds(Track const& track); NonnullOwnPtr m_stream; AVCodecContext* m_codec_context { nullptr }; AVFormatContext* m_format_context { nullptr }; NonnullOwnPtr m_io_context; AVPacket* m_packet { nullptr }; }; }