From eae7422ebc549a6a8640867907d33b076ee96710 Mon Sep 17 00:00:00 2001 From: Zaggy1024 Date: Fri, 14 Apr 2023 12:30:38 -0500 Subject: [PATCH] LibVideo: Fallibly construct playback manager fields --- .../Libraries/LibVideo/PlaybackManager.cpp | 31 +++++++++++-------- Userland/Libraries/LibVideo/PlaybackManager.h | 6 ++-- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/Userland/Libraries/LibVideo/PlaybackManager.cpp b/Userland/Libraries/LibVideo/PlaybackManager.cpp index 7587bf2321..d8973e155e 100644 --- a/Userland/Libraries/LibVideo/PlaybackManager.cpp +++ b/Userland/Libraries/LibVideo/PlaybackManager.cpp @@ -28,22 +28,22 @@ namespace Video { DecoderErrorOr> PlaybackManager::from_file(StringView filename) { auto demuxer = TRY(Matroska::MatroskaDemuxer::from_file(filename)); - return create_with_demuxer(move(demuxer)); + return create(move(demuxer)); } DecoderErrorOr> PlaybackManager::from_mapped_file(NonnullRefPtr mapped_file) { auto demuxer = TRY(Matroska::MatroskaDemuxer::from_mapped_file(move(mapped_file))); - return create_with_demuxer(move(demuxer)); + return create(move(demuxer)); } DecoderErrorOr> PlaybackManager::from_data(ReadonlyBytes data) { auto demuxer = TRY(Matroska::MatroskaDemuxer::from_data(data)); - return create_with_demuxer(move(demuxer)); + return create(move(demuxer)); } -DecoderErrorOr> PlaybackManager::create_with_demuxer(NonnullOwnPtr demuxer) +DecoderErrorOr> PlaybackManager::create(NonnullOwnPtr demuxer) { auto video_tracks = TRY(demuxer->get_tracks_for_type(TrackType::Video)); if (video_tracks.is_empty()) @@ -52,20 +52,25 @@ DecoderErrorOr> PlaybackManager::create_with_demu dbgln_if(PLAYBACK_MANAGER_DEBUG, "Selecting video track number {}", track.identifier()); - return make(demuxer, track, make()); + auto decoder = DECODER_TRY_ALLOC(try_make()); + auto frame_queue = DECODER_TRY_ALLOC(try_make()); + auto playback_manager = DECODER_TRY_ALLOC(try_make(demuxer, track, move(decoder), move(frame_queue))); + + playback_manager->m_present_timer = DECODER_TRY_ALLOC(Core::Timer::create_single_shot(0, [&self = *playback_manager] { self.timer_callback(); })); + playback_manager->m_decode_timer = DECODER_TRY_ALLOC(Core::Timer::create_single_shot(0, [&self = *playback_manager] { self.on_decode_timer(); })); + + playback_manager->m_playback_handler = make(*playback_manager, false, Time::zero(), SeekMode::Fast); + DECODER_TRY_ALLOC(playback_manager->m_playback_handler->on_enter()); + + return playback_manager; } -PlaybackManager::PlaybackManager(NonnullOwnPtr& demuxer, Track video_track, NonnullOwnPtr&& decoder) +PlaybackManager::PlaybackManager(NonnullOwnPtr& demuxer, Track video_track, NonnullOwnPtr&& decoder, NonnullOwnPtr&& frame_queue) : m_demuxer(move(demuxer)) , m_selected_video_track(video_track) , m_decoder(move(decoder)) - , m_frame_queue(make()) - , m_playback_handler(make(*this, false, Time::zero(), SeekMode::Fast)) + , m_frame_queue(move(frame_queue)) { - m_present_timer = Core::Timer::create_single_shot(0, [&] { timer_callback(); }).release_value_but_fixme_should_propagate_errors(); - m_decode_timer = Core::Timer::create_single_shot(0, [&] { on_decode_timer(); }).release_value_but_fixme_should_propagate_errors(); - - TRY_OR_FATAL_ERROR(m_playback_handler->on_enter()); } PlaybackManager::~PlaybackManager() = default; @@ -286,7 +291,7 @@ ErrorOr PlaybackManager::PlaybackStateHandler::stop() template ErrorOr PlaybackManager::PlaybackStateHandler::replace_handler_and_delete_this(Args... args) { - auto temp_handler = TRY(adopt_nonnull_own_or_enomem(new (nothrow) T(m_manager, args...))); + OwnPtr temp_handler = TRY(try_make(m_manager, args...)); m_manager.m_playback_handler.swap(temp_handler); #if PLAYBACK_MANAGER_DEBUG m_has_exited = true; diff --git a/Userland/Libraries/LibVideo/PlaybackManager.h b/Userland/Libraries/LibVideo/PlaybackManager.h index 60e538212d..44f7a9022b 100644 --- a/Userland/Libraries/LibVideo/PlaybackManager.h +++ b/Userland/Libraries/LibVideo/PlaybackManager.h @@ -105,7 +105,7 @@ public: static DecoderErrorOr> from_data(ReadonlyBytes data); - PlaybackManager(NonnullOwnPtr& demuxer, Track video_track, NonnullOwnPtr&& decoder); + PlaybackManager(NonnullOwnPtr& demuxer, Track video_track, NonnullOwnPtr&& decoder, NonnullOwnPtr&& frame_queue); ~PlaybackManager(); void resume_playback(); @@ -143,7 +143,7 @@ private: class SeekingStateHandler; class StoppedStateHandler; - static DecoderErrorOr> create_with_demuxer(NonnullOwnPtr demuxer); + static DecoderErrorOr> create(NonnullOwnPtr demuxer); void start_timer(int milliseconds); void timer_callback(); @@ -172,7 +172,7 @@ private: RefPtr m_decode_timer; - NonnullOwnPtr m_playback_handler; + OwnPtr m_playback_handler; Optional m_next_frame; u64 m_skipped_frames { 0 };