1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 15:48:12 +00:00

LibVideo+VideoPlayer: Convert playback event handler to callbacks

To pass events from LibVideo's PlaybackManager to interested parties, we
currently dispatch Core::Event objects that outside callers listen for.
Dispatching events in this manner rely on a Core::EventLoop. In order to
use PlaybackManager from LibWeb, change this mechanism to instead use a
set of callbacks to inform callers of events.
This commit is contained in:
Timothy Flynn 2023-04-08 19:18:38 -04:00 committed by Linus Groh
parent 0f2b863c01
commit 3591a13e85
4 changed files with 83 additions and 114 deletions

View file

@ -112,7 +112,7 @@ void VideoPlayerWidget::close_file()
void VideoPlayerWidget::open_file(StringView filename)
{
auto load_file_result = Video::PlaybackManager::from_file(*this, filename);
auto load_file_result = Video::PlaybackManager::from_file(filename);
if (load_file_result.is_error()) {
on_decoding_error(load_file_result.release_error());
@ -121,9 +121,30 @@ void VideoPlayerWidget::open_file(StringView filename)
m_path = filename;
update_title();
close_file();
m_playback_manager = load_file_result.release_value();
m_playback_manager->on_video_frame = [this](auto frame) {
m_video_display->set_bitmap(move(frame));
m_video_display->repaint();
update_seek_slider_max();
set_current_timestamp(m_playback_manager->current_playback_time());
};
m_playback_manager->on_playback_state_change = [this]() {
update_play_pause_icon();
};
m_playback_manager->on_decoder_error = [this](auto error) {
on_decoding_error(error);
};
m_playback_manager->on_fatal_playback_error = [this](auto) {
close_file();
};
update_seek_slider_max();
resume_playback();
}
@ -240,32 +261,6 @@ void VideoPlayerWidget::set_time_label(Time timestamp)
m_timestamp_label->set_text(string_builder.string_view());
}
void VideoPlayerWidget::event(Core::Event& event)
{
if (event.type() == Video::EventType::DecoderErrorOccurred) {
auto& error_event = static_cast<Video::DecoderErrorEvent&>(event);
on_decoding_error(error_event.error());
error_event.accept();
} else if (event.type() == Video::EventType::VideoFramePresent) {
auto& frame_event = static_cast<Video::VideoFramePresentEvent&>(event);
m_video_display->set_bitmap(frame_event.frame());
m_video_display->repaint();
update_seek_slider_max();
set_current_timestamp(m_playback_manager->current_playback_time());
frame_event.accept();
} else if (event.type() == Video::EventType::PlaybackStateChange) {
update_play_pause_icon();
event.accept();
} else if (event.type() == Video::EventType::FatalPlaybackError) {
close_file();
}
Widget::event(event);
}
void VideoPlayerWidget::drop_event(GUI::DropEvent& event)
{
event.accept();