From 971dd0e2c1d724bc7d543fea9d762ddfcd279880 Mon Sep 17 00:00:00 2001 From: Hidenori Matsubayashi Date: Wed, 4 Aug 2021 17:49:41 +0900 Subject: [PATCH] Changed to send completed event message from main thread (#22) I changed to send the completed event messages from main thread to avoid flutter engine's fml checker error. --- packages/video_player/CHANGELOG.md | 3 +++ .../video_player/elinux/gst_video_player.cc | 24 ++++++++++++------- .../video_player/elinux/gst_video_player.h | 1 + packages/video_player/pubspec.yaml | 2 +- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index 026b5ba..37a9433 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.9.2 +* Changed to send stream completed messages from main thread. + ## 0.9.1 * Temporarily disable auto-repeat. * Update the elinux template of the example app. diff --git a/packages/video_player/elinux/gst_video_player.cc b/packages/video_player/elinux/gst_video_player.cc index 9d89b30..0a9e303 100644 --- a/packages/video_player/elinux/gst_video_player.cc +++ b/packages/video_player/elinux/gst_video_player.cc @@ -141,6 +141,20 @@ int64_t GstVideoPlayer::GetCurrentPosition() { if (!gst_element_query_position(gst_.pipeline, GST_FORMAT_TIME, &position)) { std::cerr << "Failed to get current position" << std::endl; } + + // TODO: We need to handle this code in the proper plase. + // The VideoPlayer plugin doesn't have a main loop, so EOS message + // received from GStreamer cannot be processed directly in a callback + // function. This is because the event channel message of playback complettion + // needs to be thrown in the main thread. + if (is_completed_) { + is_completed_ = false; + stream_handler_->OnNotifyCompleted(); + if (auto_repeat_) { + SetSeek(0); + } + } + return position / GST_MSECOND; } @@ -360,15 +374,7 @@ GstBusSyncReply GstVideoPlayer::HandleGstMessage(GstBus* bus, switch (GST_MESSAGE_TYPE(message)) { case GST_MESSAGE_EOS: { auto* self = reinterpret_cast(user_data); - // TODO: Support auto repeat. If the following is enabled, - // the app will freeze when playback is completed. We need to investigate - // the correct auto-repeat method. -#if 0 - if (self->auto_repeat_) { - self->SetSeek(0); - } -#endif - self->stream_handler_->OnNotifyCompleted(); + self->is_completed_ = true; break; } case GST_MESSAGE_WARNING: { diff --git a/packages/video_player/elinux/gst_video_player.h b/packages/video_player/elinux/gst_video_player.h index a62cf6c..73a9ae2 100644 --- a/packages/video_player/elinux/gst_video_player.h +++ b/packages/video_player/elinux/gst_video_player.h @@ -65,6 +65,7 @@ class GstVideoPlayer { double playback_rate_ = 1.0; bool mute_ = false; bool auto_repeat_ = false; + bool is_completed_ = false; std::shared_mutex mutex_buffer_; std::unique_ptr stream_handler_; }; diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index 9cc88d1..b0d4418 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -1,6 +1,6 @@ name: video_player_elinux description: Flutter plugin for displaying inline video with other Flutter widgets on Embedded Linux. -version: 0.9.1 +version: 0.9.2 homepage: https://github.com/sony/flutter-elinux-plugins repository: https://github.com/sony/flutter-elinux-plugins/tree/main/packages/video_player/video_player