/* * Copyright (c) 2025, Gregory Bertilson * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include "DisplayingVideoSink.h" namespace Media { ErrorOr> DisplayingVideoSink::try_create(NonnullRefPtr const& time_provider) { return TRY(try_make_ref_counted(time_provider)); } DisplayingVideoSink::DisplayingVideoSink(NonnullRefPtr const& time_provider) : m_time_provider(time_provider) { } DisplayingVideoSink::~DisplayingVideoSink() = default; void DisplayingVideoSink::verify_track(Track const& track) const { if (m_provider == nullptr) return; VERIFY(m_track.has_value()); VERIFY(m_track.value() == track); } void DisplayingVideoSink::set_provider(Track const& track, RefPtr const& provider) { verify_track(track); m_track = track; m_provider = provider; } RefPtr DisplayingVideoSink::provider(Track const& track) const { verify_track(track); return m_provider; } DisplayingVideoSinkUpdateResult DisplayingVideoSink::update() { auto current_time = m_time_provider->current_time(); auto result = DisplayingVideoSinkUpdateResult::NoChange; while (true) { if (!m_next_frame.is_valid()) { m_next_frame = m_provider->retrieve_frame(); if (!m_next_frame.is_valid()) break; } if (m_next_frame.timestamp() > current_time) break; m_current_frame = m_next_frame.release_image(); result = DisplayingVideoSinkUpdateResult::NewFrameAvailable; } return result; } RefPtr DisplayingVideoSink::current_frame() { return m_current_frame; } }