mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 02:57:44 +00:00
LibVideo: Fallibly construct playback manager fields
This commit is contained in:
parent
c03152c5d2
commit
eae7422ebc
2 changed files with 21 additions and 16 deletions
|
@ -28,22 +28,22 @@ namespace Video {
|
||||||
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_file(StringView filename)
|
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_file(StringView filename)
|
||||||
{
|
{
|
||||||
auto demuxer = TRY(Matroska::MatroskaDemuxer::from_file(filename));
|
auto demuxer = TRY(Matroska::MatroskaDemuxer::from_file(filename));
|
||||||
return create_with_demuxer(move(demuxer));
|
return create(move(demuxer));
|
||||||
}
|
}
|
||||||
|
|
||||||
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_mapped_file(NonnullRefPtr<Core::MappedFile> mapped_file)
|
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_mapped_file(NonnullRefPtr<Core::MappedFile> mapped_file)
|
||||||
{
|
{
|
||||||
auto demuxer = TRY(Matroska::MatroskaDemuxer::from_mapped_file(move(mapped_file)));
|
auto demuxer = TRY(Matroska::MatroskaDemuxer::from_mapped_file(move(mapped_file)));
|
||||||
return create_with_demuxer(move(demuxer));
|
return create(move(demuxer));
|
||||||
}
|
}
|
||||||
|
|
||||||
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_data(ReadonlyBytes data)
|
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::from_data(ReadonlyBytes data)
|
||||||
{
|
{
|
||||||
auto demuxer = TRY(Matroska::MatroskaDemuxer::from_data(data));
|
auto demuxer = TRY(Matroska::MatroskaDemuxer::from_data(data));
|
||||||
return create_with_demuxer(move(demuxer));
|
return create(move(demuxer));
|
||||||
}
|
}
|
||||||
|
|
||||||
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::create_with_demuxer(NonnullOwnPtr<Demuxer> demuxer)
|
DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::create(NonnullOwnPtr<Demuxer> demuxer)
|
||||||
{
|
{
|
||||||
auto video_tracks = TRY(demuxer->get_tracks_for_type(TrackType::Video));
|
auto video_tracks = TRY(demuxer->get_tracks_for_type(TrackType::Video));
|
||||||
if (video_tracks.is_empty())
|
if (video_tracks.is_empty())
|
||||||
|
@ -52,20 +52,25 @@ DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> PlaybackManager::create_with_demu
|
||||||
|
|
||||||
dbgln_if(PLAYBACK_MANAGER_DEBUG, "Selecting video track number {}", track.identifier());
|
dbgln_if(PLAYBACK_MANAGER_DEBUG, "Selecting video track number {}", track.identifier());
|
||||||
|
|
||||||
return make<PlaybackManager>(demuxer, track, make<VP9::Decoder>());
|
auto decoder = DECODER_TRY_ALLOC(try_make<VP9::Decoder>());
|
||||||
|
auto frame_queue = DECODER_TRY_ALLOC(try_make<VideoFrameQueue>());
|
||||||
|
auto playback_manager = DECODER_TRY_ALLOC(try_make<PlaybackManager>(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<SeekingStateHandler>(*playback_manager, false, Time::zero(), SeekMode::Fast);
|
||||||
|
DECODER_TRY_ALLOC(playback_manager->m_playback_handler->on_enter());
|
||||||
|
|
||||||
|
return playback_manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
PlaybackManager::PlaybackManager(NonnullOwnPtr<Demuxer>& demuxer, Track video_track, NonnullOwnPtr<VideoDecoder>&& decoder)
|
PlaybackManager::PlaybackManager(NonnullOwnPtr<Demuxer>& demuxer, Track video_track, NonnullOwnPtr<VideoDecoder>&& decoder, NonnullOwnPtr<VideoFrameQueue>&& frame_queue)
|
||||||
: m_demuxer(move(demuxer))
|
: m_demuxer(move(demuxer))
|
||||||
, m_selected_video_track(video_track)
|
, m_selected_video_track(video_track)
|
||||||
, m_decoder(move(decoder))
|
, m_decoder(move(decoder))
|
||||||
, m_frame_queue(make<VideoFrameQueue>())
|
, m_frame_queue(move(frame_queue))
|
||||||
, m_playback_handler(make<SeekingStateHandler>(*this, false, Time::zero(), SeekMode::Fast))
|
|
||||||
{
|
{
|
||||||
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;
|
PlaybackManager::~PlaybackManager() = default;
|
||||||
|
@ -286,7 +291,7 @@ ErrorOr<void> PlaybackManager::PlaybackStateHandler::stop()
|
||||||
template<class T, class... Args>
|
template<class T, class... Args>
|
||||||
ErrorOr<void> PlaybackManager::PlaybackStateHandler::replace_handler_and_delete_this(Args... args)
|
ErrorOr<void> PlaybackManager::PlaybackStateHandler::replace_handler_and_delete_this(Args... args)
|
||||||
{
|
{
|
||||||
auto temp_handler = TRY(adopt_nonnull_own_or_enomem<PlaybackStateHandler>(new (nothrow) T(m_manager, args...)));
|
OwnPtr<PlaybackStateHandler> temp_handler = TRY(try_make<T>(m_manager, args...));
|
||||||
m_manager.m_playback_handler.swap(temp_handler);
|
m_manager.m_playback_handler.swap(temp_handler);
|
||||||
#if PLAYBACK_MANAGER_DEBUG
|
#if PLAYBACK_MANAGER_DEBUG
|
||||||
m_has_exited = true;
|
m_has_exited = true;
|
||||||
|
|
|
@ -105,7 +105,7 @@ public:
|
||||||
|
|
||||||
static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> from_data(ReadonlyBytes data);
|
static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> from_data(ReadonlyBytes data);
|
||||||
|
|
||||||
PlaybackManager(NonnullOwnPtr<Demuxer>& demuxer, Track video_track, NonnullOwnPtr<VideoDecoder>&& decoder);
|
PlaybackManager(NonnullOwnPtr<Demuxer>& demuxer, Track video_track, NonnullOwnPtr<VideoDecoder>&& decoder, NonnullOwnPtr<VideoFrameQueue>&& frame_queue);
|
||||||
~PlaybackManager();
|
~PlaybackManager();
|
||||||
|
|
||||||
void resume_playback();
|
void resume_playback();
|
||||||
|
@ -143,7 +143,7 @@ private:
|
||||||
class SeekingStateHandler;
|
class SeekingStateHandler;
|
||||||
class StoppedStateHandler;
|
class StoppedStateHandler;
|
||||||
|
|
||||||
static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> create_with_demuxer(NonnullOwnPtr<Demuxer> demuxer);
|
static DecoderErrorOr<NonnullOwnPtr<PlaybackManager>> create(NonnullOwnPtr<Demuxer> demuxer);
|
||||||
|
|
||||||
void start_timer(int milliseconds);
|
void start_timer(int milliseconds);
|
||||||
void timer_callback();
|
void timer_callback();
|
||||||
|
@ -172,7 +172,7 @@ private:
|
||||||
|
|
||||||
RefPtr<Core::Timer> m_decode_timer;
|
RefPtr<Core::Timer> m_decode_timer;
|
||||||
|
|
||||||
NonnullOwnPtr<PlaybackStateHandler> m_playback_handler;
|
OwnPtr<PlaybackStateHandler> m_playback_handler;
|
||||||
Optional<FrameQueueItem> m_next_frame;
|
Optional<FrameQueueItem> m_next_frame;
|
||||||
|
|
||||||
u64 m_skipped_frames { 0 };
|
u64 m_skipped_frames { 0 };
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue