From 8e82fd61108d54d116836531016c7266a0e96d6c Mon Sep 17 00:00:00 2001 From: hyue7 <111051566+hyue7@users.noreply.github.com> Date: Thu, 7 Sep 2023 11:41:23 +0800 Subject: [PATCH] [video_player] Disable screensaver when player is playing (#610) --- packages/video_player/CHANGELOG.md | 4 ++ packages/video_player/README.md | 2 +- packages/video_player/pubspec.yaml | 2 +- .../video_player/tizen/src/video_player.cc | 68 +++++++++++++++++++ .../video_player/tizen/src/video_player.h | 10 +++ 5 files changed, 84 insertions(+), 2 deletions(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index e10a675d3..af6e235f3 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.4.8 + +* Disable screensaver when player is playing. + ## 2.4.7 * Update pigeon to 10.0.0. diff --git a/packages/video_player/README.md b/packages/video_player/README.md index b1f06545c..f71d244ea 100644 --- a/packages/video_player/README.md +++ b/packages/video_player/README.md @@ -15,7 +15,7 @@ This package is not an _endorsed_ implementation of `video_player`. Therefore, y ```yaml dependencies: video_player: ^2.4.2 - video_player_tizen: ^2.4.7 + video_player_tizen: ^2.4.8 ``` Then you can import `video_player` in your Dart code: diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index 1f6c7c07e..f0042d87e 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_tizen description: Tizen implementation of the video_player plugin. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/video_player -version: 2.4.7 +version: 2.4.8 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/video_player/tizen/src/video_player.cc b/packages/video_player/tizen/src/video_player.cc index c2113a878..71a984303 100644 --- a/packages/video_player/tizen/src/video_player.cc +++ b/packages/video_player/tizen/src/video_player.cc @@ -4,6 +4,7 @@ #include "video_player.h" +#include #include #include @@ -78,6 +79,35 @@ FlutterDesktopGpuSurfaceDescriptor *VideoPlayer::ObtainGpuSurface( return gpu_surface_.get(); } +void VideoPlayer::InitScreenSaverApi() { + screensaver_handle_ = dlopen("libcapi-screensaver.so", RTLD_LAZY); + if (!screensaver_handle_) { + LOG_ERROR("[VideoPlayer] dlopen failed: %s", dlerror()); + return; + } + + screensaver_reset_timeout_ = reinterpret_cast( + dlsym(screensaver_handle_, "screensaver_reset_timeout")); + if (!screensaver_reset_timeout_) { + LOG_ERROR("[VideoPlayer] Symbol not found: %s", dlerror()); + return; + } + + ScreensaverOverrideReset screensaver_override_reset = + reinterpret_cast( + dlsym(screensaver_handle_, "screensaver_override_reset")); + if (!screensaver_override_reset) { + LOG_ERROR("[VideoPlayer] Symbol not found: %s", dlerror()); + return; + } + + int ret = screensaver_override_reset(false); + if (ret != 0) { + LOG_ERROR("screensaver_override_reset failed: %s", get_error_message(ret)); + return; + } +} + VideoPlayer::VideoPlayer(flutter::PluginRegistrar *plugin_registrar, flutter::TextureRegistrar *texture_registrar, const std::string &uri, VideoPlayerOptions &options) { @@ -155,6 +185,9 @@ VideoPlayer::VideoPlayer(flutter::PluginRegistrar *plugin_registrar, get_error_message(ret)); } +#ifdef TV_PROFILE + InitScreenSaverApi(); +#endif SetUpEventChannel(plugin_registrar->messenger()); } @@ -188,6 +221,9 @@ void VideoPlayer::Play() { if (ret != PLAYER_ERROR_NONE) { throw VideoPlayerError("player_start failed", get_error_message(ret)); } +#ifdef TV_PROFILE + timer_ = ecore_timer_add(30, ResetScreensaverTimeout, this); +#endif } void VideoPlayer::Pause() { @@ -206,6 +242,12 @@ void VideoPlayer::Pause() { if (ret != PLAYER_ERROR_NONE) { throw VideoPlayerError("player_pause failed", get_error_message(ret)); } + + if (timer_) { + LOG_DEBUG("[VideoPlayer] Delete ecore timer."); + ecore_timer_del(timer_); + timer_ = nullptr; + } } void VideoPlayer::SetLooping(bool is_looping) { @@ -285,6 +327,16 @@ void VideoPlayer::Dispose() { texture_registrar_->UnregisterTexture(texture_id_, nullptr); texture_registrar_ = nullptr; } + + if (screensaver_handle_) { + dlclose(screensaver_handle_); + screensaver_handle_ = nullptr; + } + + if (timer_) { + ecore_timer_del(timer_); + timer_ = nullptr; + } } void VideoPlayer::SetUpEventChannel(flutter::BinaryMessenger *messenger) { @@ -373,6 +425,22 @@ void VideoPlayer::SendInitialized() { } } +Eina_Bool VideoPlayer::ResetScreensaverTimeout(void *data) { + LOG_DEBUG("[VideoPlayer] Reset screen saver timeout."); + + auto *player = static_cast(data); + if (!player->screensaver_reset_timeout_) { + return ECORE_CALLBACK_CANCEL; + } + int ret = player->screensaver_reset_timeout_(); + if (ret != 0) { + LOG_ERROR("screensaver_reset_timeout failed: %s", get_error_message(ret)); + return ECORE_CALLBACK_CANCEL; + } + + return ECORE_CALLBACK_RENEW; +} + void VideoPlayer::OnPrepared(void *data) { LOG_DEBUG("[VideoPlayer] Player prepared."); diff --git a/packages/video_player/tizen/src/video_player.h b/packages/video_player/tizen/src/video_player.h index a7e4cebae..25af72d8e 100644 --- a/packages/video_player/tizen/src/video_player.h +++ b/packages/video_player/tizen/src/video_player.h @@ -5,6 +5,7 @@ #ifndef FLUTTER_PLUGIN_VIDEO_PLAYER_H_ #define FLUTTER_PLUGIN_VIDEO_PLAYER_H_ +#include #include #include #include @@ -19,6 +20,9 @@ #include "video_player_options.h" +typedef int (*ScreensaverResetTimeout)(void); +typedef int (*ScreensaverOverrideReset)(bool onoff); + class VideoPlayer { public: using SeekCompletedCallback = std::function; @@ -46,6 +50,7 @@ class VideoPlayer { void SetUpEventChannel(flutter::BinaryMessenger *messenger); void Initialize(); void SendInitialized(); + void InitScreenSaverApi(); static void OnPrepared(void *data); static void OnBuffering(int percent, void *data); @@ -55,6 +60,7 @@ class VideoPlayer { static void OnError(int error_code, void *data); static void OnVideoFrameDecoded(media_packet_h packet, void *data); static void ReleaseMediaPacket(void *packet); + static Eina_Bool ResetScreensaverTimeout(void *data); void RequestRendering(); void OnRenderingCompleted(); @@ -79,6 +85,10 @@ class VideoPlayer { std::queue packet_queue_; SeekCompletedCallback on_seek_completed_; + + void *screensaver_handle_; + ScreensaverResetTimeout screensaver_reset_timeout_; + Ecore_Timer *timer_; }; #endif // FLUTTER_PLUGIN_VIDEO_PLAYER_H_