/* * Copyright (c) 2022, Gregory Bertilson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include "Demuxer.h" namespace Media { class MutexedDemuxer final : public Demuxer { public: MutexedDemuxer(NonnullRefPtr demuxer) : m_demuxer(move(demuxer)) { } virtual ~MutexedDemuxer() override { m_demuxer.with_locked([](auto& demuxer) { auto to_destroy = move(demuxer); }); } virtual DecoderErrorOr> get_tracks_for_type(TrackType type) override { return m_demuxer.with_locked([&](auto& demuxer) { return demuxer->get_tracks_for_type(type); }); } virtual DecoderErrorOr> get_preferred_track_for_type(TrackType type) override { return m_demuxer.with_locked([&](auto& demuxer) { return demuxer->get_preferred_track_for_type(type); }); } virtual DecoderErrorOr get_next_sample_for_track(Track track) override { return m_demuxer.with_locked([&](auto& demuxer) { return demuxer->get_next_sample_for_track(track); }); } virtual DecoderErrorOr get_codec_id_for_track(Track track) override { return m_demuxer.with_locked([&](auto& demuxer) { return demuxer->get_codec_id_for_track(track); }); } virtual DecoderErrorOr get_codec_initialization_data_for_track(Track track) override { return m_demuxer.with_locked([&](auto& demuxer) { return demuxer->get_codec_initialization_data_for_track(track); }); } virtual DecoderErrorOr> seek_to_most_recent_keyframe(Track track, AK::Duration timestamp, Optional earliest_available_sample = {}) override { return m_demuxer.with_locked([&](auto& demuxer) { return demuxer->seek_to_most_recent_keyframe(track, timestamp, earliest_available_sample); }); } virtual DecoderErrorOr duration_of_track(Track const& track) override { return m_demuxer.with_locked([&](auto& demuxer) { return demuxer->duration_of_track(track); }); } virtual DecoderErrorOr total_duration() override { return m_demuxer.with_locked([&](auto& demuxer) { return demuxer->total_duration(); }); } private: Threading::MutexProtected> m_demuxer; }; }