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:
parent
0f2b863c01
commit
3591a13e85
4 changed files with 83 additions and 114 deletions
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue